python模块介绍- time 时间访问和转换

python模块介绍- time 时间访问和转换 

简介

该模块提供的各种时间相关的函数。相关模块有datetime和calendar。注意不是所有函数都是跨平台的。多数函数调用c库函数中的同名函数,所以参阅平台文档会有帮助。

下面介绍一些术语和约定:

epoch是时间开始点。对于Unix ,时代是1970年1月1日0点。通过time.gmtime(0)可以查看时间的起点:

In [2]: time.gmtime(0)Out[2]: time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

对于32位的linux系统,时间只能处理到2038年。

>>> time.gmtime(time.time() + 786041553)Traceback (most recent call last):
  File "<stdin>", line 1, in <module>ValueError: timestamp out of range for platform time_t

UTC是协调世界时(前身为格林威治标准时间或GMT)。

DST为夏令时,通常是根据当地法律在一年内的部分时间进行一小时的调整。 C库包含有当地规则的表。

实际函数的精度可能比建议的要低。例如在大多数Unix系统中,时钟“滴答”只有50或100次每秒。

gmtime(), localtime()和strptime()的返回是包含9个整数的序列,可以作为asctime(), mktime() and strftime()的输入,每个域都有自己的属性,实际上是一个结构体struct_time,参见上面的例子。

时间转换:gmtime()把浮点时间转为UTC的struct_time,反之calendar.timegm();localtime()把浮点时间转为local的struct_time,反之mktime()。实际上calendar.timegm()和mktime()是等效的,不过前者返回整数,后者返回浮点数。

  • 功能:时间访问和转换。

  • 类型:标准模块

  • 相关模块:

    1. datetime 标准模块。

    2. calendar 标准模块。

    3. Python-dateutil 日下载量2万左右,强烈推荐

时间生成与转换

生成epoch的浮点数

In [30]: time.time()Out[30]: 1386057314.581948

注意不同的系统精度不同,linux一般是小数点后面7为,windows一般是小数点后3位。Time函数是没有参数的。可以直接对返回的浮点数进行计算:

In [31]: time.gmtime(time.time() + 786041553)Out[31]: time.struct_time(tm_year=2038, tm_mon=10, tm_mday=31, tm_hour=0, tm_min=57, tm_sec=18, tm_wday=6, tm_yday=304, tm_isdst=0)

上述命令因为处理年限的关系,在32位linux上面会报错:

>>> time.gmtime(time.time() + 786041553)Traceback (most recent call last):
  File "<stdin>", line 1, in <module>ValueError: timestamp out of range for platform time_t

上述命令中的gmtime([secs])把浮点时间转为UTC的struct_time,如果无输入参数为空会调用time()读取当前时间,如:

In [32]: time.gmtime()Out[32]: time.struct_time(tm_year=2013, tm_mon=12, tm_mday=3, tm_hour=8, tm_min=8, tm_sec=46, tm_wday=1, tm_yday=337, tm_isdst=0)

上面显示的是世界协调时间, localtime([secs])可以显示本地时间:

 In [34]: time.localtime()Out[34]: time.struct_time(tm_year=2013, tm_mon=12, tm_mday=3, tm_hour=16, tm_min=14, tm_sec=40, tm_wday=1, tm_yday=337, tm_isdst=0)

注意夏时制要设置dst。asctime([t])显示时间为可读性好的格式,它gmtime(), localtime()和strptime()的返回的struct_time类型转换为可读性较好的格式。如果输入参数为空则调用localtime()的返回结果。它和c函数不同的地方是末尾不会添加换行。asctime不会使用Locale信息。

In [35]: time.asctime()Out[35]: 'Tue Dec  3 16:18:02 20

ctime([secs])在asctime上更进一步,转换浮点数为可读性较好的格式,相当于asctime(localtime(secs)), 这个功能很常用。ctime不会使用Locale信息。

In [33]: time.ctime()Out[33]: 'Tue Dec  3 16:12:37 2013'

Sleep

sleep(secs)暂停执行指定秒数。参数可以是整数或浮点数。实际的中止时间可能小于请求时间,因为例行的信号捕捉可能终止sleep。此外中止时间可能长于请求时间,因为因为系统调度也是需要时间

In [36]: time.sleep(3)

处理器时间

clock()在Unix上,返回当前的处理器时间,为以秒表示的浮点数。精度决于同名的C函数,通常用于基准Python或定时的算法。我们书写一个不耗cpu和耗cpu的脚本对比:

import timefor i in range(6, 1, -1):
    print '%s %0.2f %0.2f' % (time.ctime(),
                              time.time(),
                              time.clock())
    print 'Sleeping', i
    time.sleep(i)

执行结果:

# python time_clock_sleep.pyTue Dec  3 16:34:55 2013 1386059695.94 0.07
Sleeping 6
Tue Dec  3 16:35:01 2013 1386059701.94 0.07
Sleeping 5
Tue Dec  3 16:35:06 2013 1386059706.95 0.07
Sleeping 4
Tue Dec  3 16:35:10 2013 1386059710.95 0.07
Sleeping 3
Tue Dec  3 16:35:13 2013 1386059713.95 0.07
Sleeping 2
import hashlibimport time# Data to use to calculate md5 checksumsdata = 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(300000):
        h.update(data)
    cksum = h.digest()

执行结果:

# python time_clock.pyTue Dec  3 16:27:24 2013 : 1386059244.364 0.090
Tue Dec  3 16:27:25 2013 : 1386059245.187 0.910
Tue Dec  3 16:27:25 2013 : 1386059245.943 1.660
Tue Dec  3 16:27:26 2013 : 1386059246.698 2.420
Tue Dec  3 16:27:27 2013 : 1386059247.452 3.170

struct_time类

struct_time是的命名元组,结构如下:

索引(Index) 属性(Attribute) 值(Values)
0 tm_year(年 比如2013
1 tm_mon(月)  1 - 12
2 tm_mday(日) 1 - 31
3 tm_hour(时)  0 - 23
4 tm_min(分) 0 - 59
5 tm_sec(秒) 0 - 61
6 tm_wday(weekday 0 - 6(0表示周日
7 tm_yday(一年中的第几天) 1 - 366
8 tm_isdst(是否是夏令时) 默认为-1
import timedef show_struct(s):
    print '  tm_year :', s.tm_year    print '  tm_mon  :', s.tm_mon    print '  tm_mday :', s.tm_mday    print '  tm_hour :', s.tm_hour    print '  tm_min  :', s.tm_min    print '  tm_sec  :', s.tm_sec    print '  tm_wday :', s.tm_wday    print '  tm_yday :', s.tm_yday    print '  tm_isdst:', s.tm_isdstprint 'gmtime:'show_struct(time.gmtime())print '\nlocaltime:'show_struct(time.localtime())print '\nmktime:', time.mktime(time.localtime())

执行结果:

# python time_struct.pygmtime:
  tm_year : 2013
  tm_mon  : 12
  tm_mday : 3
  tm_hour : 9
  tm_min  : 55
  tm_sec  : 54
  tm_wday : 1
  tm_yday : 337
  tm_isdst: 0

localtime:
  tm_year : 2013
  tm_mon  : 12
  tm_mday : 3
  tm_hour : 17
  tm_min  : 55
  tm_sec  : 54
  tm_wday : 1
  tm_yday : 337
  tm_isdst: 0

mktime: 1386064554.0

时区

重置库函数的时间转换规则。实际上是修改环境变量TZ,python 2.3以后类linux支持该功能,这个功能相对不是那么常用。TZ环境变量的格式如下:

std offset [dst [offset [,start[/time], end[/time]]]]

STD和DST为时区缩写。hh[:mm[:ss]],表示加上这个时间可以得到UTC时间。偏移量的形式为: HH [ : MM [ : SS] ],夏时制增加1小时。

starttime, endtime表示使用夏时制的区间。time和偏移类似,默认时间是02:00:00。比如:

>>> os.environ['TZ'] = 'EST+05EDT,M4.1.0,M10.5.0'>>> time.tzset()>>> time.strftime('%X %x %Z')'02:07:36 05/08/03 EDT'>>> os.environ['TZ'] = 'AEST-10AEDT-11,M10.5.0,M3.5.0'>>> time.tzset()>>> time.strftime('%X %x %Z')'16:08:12 05/08/03 AEST'

在许多Unix系统(包括* BSD,Linux和Solaris,和Darwin),使用系统时区数据库更方便。

>>> os.environ['TZ'] = 'US/Eastern'>>> time.tzset()>>> time.tzname('EST', 'EDT')>>> os.environ['TZ'] = 'Egypt'>>> time.tzset()>>> time.tzname('EET', 'EEST')

另一实例:

import timeimport osdef show_zone_info():
    print '  TZ    :', os.environ.get('TZ', '(not set)')
    print '  tzname:', time.tzname    print '  Zone  : %d (%d)' % (time.timezone,
                                 (time.timezone / 3600))
    print '  DST   :', time.daylight    print '  Time  :', time.ctime()
    printprint 'Default :'show_zone_info()ZONES = [ 'GMT',
          'Europe/Amsterdam',
          ]for zone in ZONES:
    os.environ['TZ'] = zone
    time.tzset()
    print zone, ':'
    show_zone_info()

执行结果:

# python time_timezone.pyDefault :
  TZ    : (not set)
  tzname: ('CST', 'CST')
  Zone  : -28800 (-8)
  DST   : 0
  Time  : Wed Dec  4 11:13:26 2013

GMT :
  TZ    : GMT
  tzname: ('GMT', 'GMT')
  Zone  : 0 (0)
  DST   : 0
  Time  : Wed Dec  4 03:13:26 2013

Europe/Amsterdam :
  TZ    : Europe/Amsterdam
  tzname: ('CET', 'CEST')
  Zone  : -3600 (-1)
  DST   : 1
  Time  : Wed Dec  4 04:13:26 2013

格式化

time.strftime(format[, t]):把一个代表时间的元组或者struct_tim转为格式化的时间字符串。如果t未指定,将调用time.localtime()的返回作为输入。如果输入中任何一个元素越界将报ValueError异常。格式化参数如下:

格式 含义 备注
%a 本地简化星期名
%A 本地完整星期名
%b 本地简化月份名
%B 本地完整月份名称
%c 本地相应的日期和时间表示
%d 日期(01 - 31)
%H 小时(24小时制,00 - 23)
%I 小时(12小时制,01 - 12)
%j 天数(基于年)(001 - 366)
%m 月份(01 - 12)
%M 分钟(00 - 59)
%p 显示am或pm的标识
%S 秒(01 - 61)
%U 周数(基于年)(00 – 53周日是星期的开始。)第一个周日之前的所有天数都放在第0周。
%w 星期中的天数(0 - 6,0是星期天)
%W 和%U基本相同,以星期一为星期的开始。
%x 本地相应日期表示
%X 本地相应时间表示
%y 去掉世纪的年份(00 - 99)
%Y 完整的年份
%Z 时区的名字(如果不存在为空字符)
%% '%’字符

  备注:

  • “%p”只有与“%I”配合使用才有效果。

  • 秒是0 - 61,而不是59,以处理闰秒和双闰秒。

  • 当使用strptime()函数时,只有当在这年中的周数和天数被确定的时候%U和%W才会被计算。

比如:

In [12]: time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime())Out[12]: 'Wed, 04 Dec 2013 03:34:58 +0000'

下面方式在给文件名等添加时间戳比较有用:

>>> time.strftime("%Y-%m-%d_%H:%M:%S", time.gmtime())'2013-12-28_01:40:19'

显示格式可能因系统而又不同的差异。

time.strptime(string[, format]):把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作,参数参见strftime。Format默认为"%a %b %d %H:%M:%S %Y",和ctime的返回格式一致,没有提供的值会采用默认值(1900, 1, 1, 0, 0, 0, 0, 1, -1)。

In [14]: time.strptime("30 Nov 00", "%d %b %y")Out[14]: time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)

其他

altzone属性查看当前夏时制时间的偏移。daylight属性查看是否使用了夏时制。timezone查看当前时区的偏移。Tzname返回本地时区和夏时制对应的时区。

In [3]: time.altzone
Out[3]: -28800In [4]: time.daylight
Out[4]: 0In [5]: time.timezone
Out[5]: -28800In [6]: time.tzname
Out[6]: ('CST', 'CST')

本文地址

  • http://automationtesting.sinaapp.com/blog/m_time

参考资料

  • http://docs.python.org/2/library/time.html

  • http://pymotw.com/2/time/



    你可能感兴趣的:(python,模块,time,时间访问和转换)