time模块提供了操作日期和时间的函数
time模块的核心函数之一就是time.time()函数, 它返回一个自公元开始的总秒数(浮点型).
本工具包含三个文件:
import time
print 'The time is:', time.time()
虽然返回的值是浮点型, 但精度是依赖于不同的系统平台的.
$ python time_time.py
The time is: 1205079300.54
当存储和比较日期时, 浮点型一般是很有用的, 但这种方式不易阅读, 为了更有用的记录和输出时间可以使用time.ctime().
import time
print 'The time is :', time.ctime()
later = time.time() + 15
print '15 secs from now :', time.ctime(later)
上面第二行示范了如何来利用ctime()函数对当前时间进行格式化.
$ python time_ctime.py
The time is : Sun Mar 9 12:18:02 2008
15 secs from now : Sun Mar 9 12:18:17 2008
time()函数返回的是现实世界的时间, 而clock()函数返回的是cpu时钟. clock()函数返回值常用作性能测试, benchmarking等. 它们常常反映了程序运行的真实时间, 比time()函数返回的值要精确.
import hashlib
import time
# Data to use to calculate md5 checksums
data = open(__file__, 'rt').read()
for i in range(5):
h = hashlib.sha1()
print time.ctime(), ': %0.3f %0.3f' % (time.time(), time.clock())
for i in range(100000):
h.update(data)
cksum = h.digest()
在这个例子中, ctime()把time()函数返回的浮点型表示转化为标准时间, 每个迭代循环使用了clock(). 如果想在机器上测试这个例子, 那么可以增加循环次数, 或者处理大一点的数据, 这样才能看到不同点.
$ python time_clock.py
Sun Mar 9 12:41:53 2008 : 1205080913.260 0.030
Sun Mar 9 12:41:53 2008 : 1205080913.682 0.440
Sun Mar 9 12:41:54 2008 : 1205080914.103 0.860
Sun Mar 9 12:41:54 2008 : 1205080914.518 1.270
Sun Mar 9 12:41:54 2008 : 1205080914.932 1.680
一般, 如果程序没有做任何事情, 处理器时钟是不会计时.
import time
for i in range(6, 1, -1):
print '%s %0.2f %0.2f' % (time.ctime(), time.time(), time.clock())
print 'Sleeping', i
time.sleep(i)
在这个例子中, 每次迭代, 循环中处理了很少的任务就进入了sleep, 当进程在睡眠中时, time.time()函数的返回值依然会增加. 但是time.clock()是不会增加的.
$ python time_clock_sleep.py
Sun Mar 9 12:46:36 2008 1205081196.20 0.02
Sleeping 6
Sun Mar 9 12:46:42 2008 1205081202.20 0.02
Sleeping 5
Sun Mar 9 12:46:47 2008 1205081207.20 0.02
Sleeping 4
Sun Mar 9 12:46:51 2008 1205081211.20 0.02
Sleeping 3
Sun Mar 9 12:46:54 2008 1205081214.21 0.02
Sleeping 2
time.sleep函数控制当前的线程, 让它等待直到系统重新唤醒它, 如果应用中只有一个线程, 那么它会阻塞当前进程, 使其不做任何事情.
某些时候, 使用逝去的秒数来表示时间是很有用的. 有时候你需要获取日期的单独部分(如年、月等等), time模块定义了struct_time来存储日期和时间值并作为其部分以便获取. 提供了多种函数将struct_time转化为float.
import time
print 'gmtime :', time.gmtime()
print 'localtime:', time.localtime()
print 'mktime :', time.mktime(time.localtime())
print
t = time.localtime()
print 'Day of month:', t.tm_mday
print ' Day of week:', t.tm_wday
print ' Day of year:', t.tm_yday
gmtime()返回当前的UTC时间, localtime()返回当前时间域的当前时间, mktime()接收struct_time参数并将其转化为浮点型来表示.
$ python time_struct.py
gmtime : (2008, 3, 9, 16, 58, 19, 6, 69, 0)
localtime: (2008, 3, 9, 12, 58, 19, 6, 69, 1)
mktime : 1205081899.0
Day of month: 9
Day of week: 6
Day of year: 69
函数strptime()和strftime()可以使struct_time和时间值字符串相互转化. 有一个很长的格式化说明列表可以用来支持输入和输出不同的风格. 完整的列表在time模块的的库文档中有介绍.
下面示例把当前时间(字符串)转化为struct_time实例, 然后再转化为字符串.
import time
now = time.ctime()
print now
parsed = time.strptime(now)
print parsed
print time.strftime("%a %b %d %H:%M:%S %Y", parsed)
输出和输入字符串不是完全的一致, 主要表现在月份前加了一个0前缀.
$ python time_strptime.py
Sun Mar 9 13:01:19 2008
(2008, 3, 9, 13, 1, 19, 6, 69, -1)
Sun Mar 09 13:01:19 2008
无论是你的程序, 还是为系统使用一个默认的时区, 检测当前时间的函数依赖于当前Time Zone(时间域)的设置. 改变时区设置是不会改变实际时间, 只会改变表示时间的方法.
通过设置环境变量TZ可以改变时区, 然后调用tzset(). 环境变量TZ可以对时区来详细的设置, 比如白天保存时间的起始点. 通常使用时区名称是比较简单的, 如果需要了解更多信息可以参考库.
下面这个示例改变了time zone中的一些值, 展示了这种改变如何来影响time模块中的其它设置.
import time
import os
def show_zone_info():
print '\tTZ :', os.environ.get('TZ', '(not set)')
print '\ttzname:', time.tzname
print '\tZone : %d (%d)' % (time.timezone, (time.timezone / 3600))
print '\tDST :', time.daylight
print '\tTime :', time.ctime()
print
print 'Default :'
show_zone_info()
for zone in [ 'US/Eastern', 'US/Pacific', 'GMT', 'Europe/Amsterdam' ]:
os.environ['TZ'] = zone
time.tzset()
print zone, ':'
show_zone_info()
我的时区是US/Eastern, 所以设置TZ不会起作用. 如果是其它时区, 则会改变tzname、daylight flag以及timezone偏移值.
$ python time_timezone.py
Default :
TZ : (not set)
tzname: ('EST', 'EDT')
Zone : 18000 (5)
DST : 1
Time : Sun Mar 9 13:06:53 2008
US/Eastern :
TZ : US/Eastern
tzname: ('EST', 'EDT')
Zone : 18000 (5)
DST : 1
Time : Sun Mar 9 13:06:53 2008
US/Pacific :
TZ : US/Pacific
tzname: ('PST', 'PDT')
Zone : 28800 (8)
DST : 1
Time : Sun Mar 9 10:06:53 2008
GMT :
TZ : GMT
tzname: ('GMT', 'GMT')
Zone : 0 (0)
DST : 0
Time : Sun Mar 9 17:06:53 2008
Europe/Amsterdam :
TZ : Europe/Amsterdam
tzname: ('CET', 'CEST')
Zone : -3600 (-1)
DST : 1
Time : Sun Mar 9 18:06:53 2008