概念
关于时间你因该了解的几个概念:
秒
在1967年的第13届国际度量衡会议上决定以原子时定义的秒作为时间的国际标准单位:铯133原子基态的两个超精细能阶间跃迁对应辐射的9,192,631,770个周期的持续时间, 起始历元定在1958年1月1日0时。
原子钟
原子钟是一种时钟,它以原子共振频率标准来计算及保持时间的准确。原子钟是世界上已知最准确的时间测量和频率标准。
GMT
格林威治标准时间(Greenwich Mean Time),是指位于伦敦郊区的皇家格林威治天文台的标准时间,因为本初子午线(Prime meridian)被定义为通过那里的经线。GMT也叫世界时UT。
UTC
协调世界时间(Coordinated Universal Time), 又称世界标准时间,基于国际原子钟,误差为每日数纳秒。协调世界时的秒长与原子时的秒长一致,在时刻上则要求尽量与世界时接近(规定二者的差值保持在 0.9秒以内)。
闰秒
是的,不只有闰年,还有闰秒。闰秒是指为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中(也可能在季末)对协调世界时增加或减少1秒的调整。由于地球自转的不均匀性和长期变慢性(主要由潮汐摩擦引起的),会使世界时(民用时)和原子时之间相差超过到±0.9秒时,就把世界时向前拨1秒(负闰秒,最后一分钟为59秒)或向后拨1秒(正闰秒,最后一分钟为61秒); 闰秒一般加在公历年末或公历六月末。
时区
时区是地球上的区域使用同一个时间定义。有关国际会议决定将地球表面按经线从南到北,划分成24个时区,并且规定相邻区域的时间相差1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。比如我大中国处于东八区,表示为GMT+8。
夏令时
夏令时(Daylight Saving Time:DST),又称日光节约时制、日光节约时间或夏令时间。这是一种为节约能源而人为规定地方时间的制度,在夏天的时候,白天的时间会比较长,所以为了节约用电,因此在夏天的时候某些地区会将他们的时间定早一小时,也就是说,原本时区是8点好了,但是因为夏天太阳比较早出现,因此把时间向前挪,在原本8点的时候,订定为该天的9点(时间提早一小时)~如此一来,我们就可以利用阳光照明,省去了花费电力的时间,因此才会称之为夏季节约时间!
Unix时间戳
指的是从协调世界时(UTC)1970年1月1日0时0分0秒开始到现在的总秒数,不考虑闰秒。
Python标准库中的时间处理模块
从Python标准库中与时间处理相关的模块有time
,datetime
,calendar
。
time
这个库里面的函数大部分是根据C标准库来的,并保持了相同的函数名。
常用的俩个函数, time函数返回Unix时间戳:
>> import time
>> time.time()
1466844017.3748803
sleep函数,让系统休眠,单位为秒:
>> time.sleep(1)
datetime
这个模块是比较常用的了, 主要提供了几个处理日期和时间的类。date
类只涉及年日月,time
类只涉及时分秒及微妙,datetime
类则包含了前俩个对象:
>> from datetime import datetime
>> now = datetime.now()
>> now
datetime(2016, 6, 25, 17, 17, 50, 426215)
>> now.weekday()
5
timedelta
类用于表示俩个datetime
之间的差值, 比如获取一小时之后的时间:
>> now + datime.timedelta(hours=1)
tzinfo
用于创建一个时区对象:
>> from datetime import datetime, timedelta, tzinfo
>> class ASH(tzinfo):
... def utcoffset(self, dt):
... return timedelta(hours=8)
... def dst(self, dt):
... return timedelta(0)
... def tzname(self, dt):
... return 'Asia/Shanghai'
calendar
可以像Unix的cal
一样输出日历,并提供了一些与日历相关的函数。至今未使用过这个模块。
此外,pytz
和dateutil
这俩个库(不是标准库)为处理时间日期提供了更多的支持。
Arrow
使用标准库处理时间还是相当繁杂的是不是,于是,有程序员受不了了,撸了一个Arrow出来,从此,处理时间和日期变得相当简单:
>> import arrow
>> arrow.utcnow()
<Arrow [2016-06-21T08:03:28.400832+00:00]>
>> local = arrow.now('Asia/Shanghai')
>> local
<Arrow [2016-06-21T16:04:12.923334+08:00]>
>> local.humanize(locale='zh_cn')
'2分钟前'