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