Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


python之time模块

在编程中经常需要花费大量的精力来处理日期和时间。在Python有许多关于日期时间的内置库可以帮助我们减轻不少处理时间的工作,所以这次先从time模块介绍开始。

需要注意的是在time模块中的大多数函数是调用了所在平台C library的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。另外一点是,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 – 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用另一个Python时间模块,datetime模块更好。

由于Python的time模块实现主要调用C库,所以各个平台可能有所不同通常有这几种方式来表示时间,time模块中时间表现的格式主要有三种:

  • 时间戳(timestamp):通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。返回的是flot类型的数字。产生时间戳方式的函数主要有time(),clock()等。
  • 格式化的时间字符串(Format String)
  • 结构化的时间(structtime):structtime是一个元组类型,共有9个元素(见下表),而gmtime()localtime()strptime()这几个函数返回的都是struct_time类型。

其中struct_time共有9个主要元素如下,元素值可以通过索引和属性名直接获取。

通过下面的例子看到,gmtime()localtime()strptime()这几个函数返回的确实都是struct_time类型。

import time  
print(time.gmtime())  
print(time.localtime())  
print(time.strptime('2011-05-05 16:37:06', '%Y-%m-%d %X'))

# 输出如下:
# time.struct_time(tm_year=2019, tm_mon=3, tm_mday=21, tm_hour=4, tm_min=49, tm_sec=33, tm_wday=3, tm_yday=80, tm_isdst=0)
# time.struct_time(tm_year=2019, tm_mon=3, tm_mday=21, tm_hour=12, tm_min=49, tm_sec=33, tm_wday=3, tm_yday=80, tm_isdst=0)
# time.struct_time(tm_year=2011, tm_mon=5, tm_mday=5, tm_hour=16, tm_min=37, tm_sec=6, tm_wday=3, tm_yday=125, tm_isdst=-1)

接着让我们了解下time模块常用的几个函数:

  • time() 返回当前时间的一个时间戳。

  • sleep() 线程将推迟指定的时间后运行,单位为秒。其精度为亚秒级。

  • ctime() 将一个时间戳(默认为当前时间)转换成一个时间字符串。

  • localtime() 将一个时间戳转化为当前地区的一个struct_time()类型元组,未设置默认为当前时间。

  • gmtime() gmtime()与localtime类似,不过返回的UTC世界标准时间。

  • mktime() 将一个strut_time 转化为时间戳。

  • clock() 返回的是程序进程运行时间。

  • asctime() 把一个代表时间的元组或者struct_time类型元组,转换为类似Thu Mar 21 15:05:36 2019这样的形式。

  • strptime('2011-05-05 16:37:06', '%Y-%m-%d %X') 把一个格式化时间字符串转化为struct_time。实际上它和strftime()是逆操作。

  • strftime('%Y-%m-%d %X', (2009, 2, 17, 17, 3, 38, 1, 48, 0)) 把一个代表时间的元组或者struct_time类型元组转化为格式化的时间字符串。

    关于格式指定信息可以参见官方详细文档:https://docs.python.org/3.5/library/time.html#time.struct_time

了解了time模块的函数后,我们来了解下一开始提到的关于时间戳(timestamp)、格式化的时间字符串(Format String)、结构化的时间(structtime),这三者的关系。我们可以用gmtime()localtime()strptime()这几个函数得到结构化的时间structtime类型,然后用mktime()函数把struct_time类型转换为时间戳(timestamp),而时间戳是一个单精度的float数字,阅读起来麻烦,我们可以再用ctime()函数把时间戳换换为时间字符串格式。

在下面的例子中,最里层的time.localtime()函数返回了一个structtime类型,接着,外面一层time.mktime()函数把里面的structtime类型会转换为时间戳,最后time.ctime()函数又把时间戳转换输出为'Thu Mar 21 15:23:32 2019'

time.ctime(time.mktime(time.localtime()))

# 输出如下:
# 'Thu Mar 21 15:23:32 2019'

最后引用网上的两张关系图表,它们清晰的总结了几个函数和返回类型之间的转换关系:

time1

time2

最近的文章

python之datetime模块

Python的时间管理模块中除了time模块外还有非常好用的datetime模块,但不得不说的是有一点非常令人困扰,因为在datetime模块中有一个time对象,而time模块本身还有一个函数叫ti…

Python, 技术博文详细阅读
更早的文章

关于Python鸭子类型

Python对实现多态性的要求很宽松,这就代表我们可以对不同对象调用同名的操作,甚至不用关注和谐对象的类型是什么,我们称这样的方式叫做鸭子类型。说的再通俗一点,就是如果某个对象的形状像鸭子,走的像鸭子…

Python, 技术博文详细阅读
comments powered by Disqus