status |
草稿 |
清风 & liz; 100% |
PCS213 time
概述
time是Python的时间处理模块.时间处理是在编程的时候经常遇到的一个问题,经常遇到的问题有如:如何获取当前unix时间戳,怎样求出15分钟后是几点几分?如何格式化时间?如何设置时区信息等等.
使用
time.time()
可以直接使用time.time()获取当前时间戳,如:
1 import time
2 print 'The time is:', time.time()
运行结果:
~$ python pcs-213-1.py The time is: 1209465739.3
time.ctime()
当存储和比较日期时,浮点型一般是很有用的,但这种方式不易阅读,为了更有用的记录和输出时间可以使用time.ctime():
1 import time
2 print 'The time is :', time.ctime()
3 later = time.time() + 15
4 print '15 secs from now :', time.ctime(later)
上例表明了如何来利用ctime()函式对当前时间进行格式化,运行下可以看到:
~$ python pcs-213-2.py The time is : Sun Mar 9 12:18:02 2008 15 secs from now : Sun Mar 9 12:18:17 2008
time.clock()
time()函式返回的是现实世界的时间,而clock()函式返回的是cpu时钟。clock()函式返回值常用作性能测试,benchmarking等。它们常常反映了程序运行的真实时间,比time()函式返回的值要精确。
1 # -*- coding: utf-8 -*-
2 import hashlib
3 import time
4
5 # 用于计算md5校验和的数据
6
7 data = open(__file__, 'rt').read()
8
9 for i in range(5):
10 h = hashlib.sha1()
11 print time.ctime(), ': %0.3f %0.3f' % (time.time(), time.clock())
12 for i in range(100000):
13 h.update(data)
14 cksum = h.digest()
在这个例子中,ctime()把time()函式返回的浮点型表示转化为标准时间,每个迭代循环使用了clock()。如果想在机器上测试这个例子,那么可以增加循环次数,或者处理大一点的数据,这样才能看到不同点。
~$ python pcs-213-3.py Sun Sep 7 16:05:44 2008 : 1220774744.580 0.010 Sun Sep 7 16:05:44 2008 : 1220774744.891 0.240 Sun Sep 7 16:05:45 2008 : 1220774745.221 0.490 Sun Sep 7 16:05:45 2008 : 1220774745.546 0.720 Sun Sep 7 16:05:45 2008 : 1220774745.861 0.970
但有点注意的是,如果程序没有做任何事情,处理器时钟是不会计时。
struct_time
有时候你需要获取日期的单独部分(如年、月等等),time模块定义了struct_time来存储日期和时间值并作为其部分以便获取。提供了多种函式将struct_time转化为float。
1 import time
2
3 print 'gmtime :', time.gmtime()
4 print 'localtime:', time.localtime()
5 print 'mktime :', time.mktime(time.localtime())
6
7 print
8 t = time.localtime()
9 print 'Day of month:', t.tm_mday
10 print ' Day of week:', t.tm_wday
11 print ' Day of year:', t.tm_yday
gmtime()返回当前的UTC时间,localtime()返回当前时间域的当前时间,mktime()接收struct_time参数并将其转化为浮点型来表示。
~$ python pcs-213-4.py gmtime : (2008, 9, 7, 8, 8, 13, 6, 251, 0) localtime: (2008, 9, 7, 16, 8, 13, 6, 251, 0) mktime : 1220774893.0 Day of month: 7 Day of week: 6 Day of year: 251
解析和格式化时间
函式strptime()和strftime()可以使struct_time和时间值字符串相互转化。下面示例把当前时间(字符串)转化为struct_time实例,然后再转化为字符串。
1 import time
2
3 now = time.ctime()
4 print now
5 parsed = time.strptime(now)
6 print parsed
7 print time.strftime("%a %b %d %H:%M:%S %Y", parsed)
输出和输入字符串不是完全的一致,主要表现在月份前加了一个0前缀。
~$ python pcs-213-5.py Sun Sep 7 16:10:09 2008 (2008, 9, 7, 16, 10, 9, 6, 251, -1) Sun Sep 07 16:10:09 2008
使用Time Zone(时区)
无论是你的程序,还是为系统使用一个默认的时区,检测当前时间的函式依赖于当前时区的设置。改变时区设置是不会改变实际时间,只会改变表示时间的方法。 通过设置环境变量TZ可以改变时区,然后调用tzset()。环境变量TZ可以对时区来详细的设置,比如白天保存时间的起始点。下面这个示例改变了time zone中的一些值,展示了这种改变如何来影响time模块中的其它设置。
1 import time
2 import os
3
4 def show_zone_info():
5 print '\tTZ :', os.environ.get('TZ', '(not set)')
6 print '\ttzname:', time.tzname
7 print '\tZone : %d (%d)' % (time.timezone, (time.timezone / 3600))
8 print '\tDST :', time.daylight
9 print '\tTime :', time.ctime()
10 print
11
12 print 'Default :'
13 show_zone_info()
14
15 for zone in [ 'US/Eastern', 'US/Pacific', 'GMT']:
16 os.environ['TZ'] = zone
17 time.tzset()
18 print zone, ':'
19 show_zone_info()
~$ python pcs-213-6.py
Default :
TZ : (not set)
tzname: ('CST', 'CST')
Zone : -28800 (-8)
DST : 0
Time : Sun Sep 7 16:12:48 2008
US/Eastern :
TZ : US/Eastern
tzname: ('EST', 'EDT')
Zone : 18000 (5)
DST : 1
Time : Sun Sep 7 04:12:48 2008
US/Pacific :
TZ : US/Pacific
tzname: ('PST', 'PDT')
Zone : 28800 (8)
DST : 1
Time : Sun Sep 7 01:12:48 2008
GMT :
TZ : GMT
tzname: ('GMT', 'GMT')
Zone : 0 (0)
DST : 0
Time : Sun Sep 7 08:12:48 2008