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'
最后引用网上的两张关系图表,它们清晰的总结了几个函数和返回类型之间的转换关系: