如何在Python中比较calendar.timegm()和time.mktime()?
在Python中,有两个时间转换的常用函数,分别是calendar.timegm()和time.mktime()。两者非常相似,都可以将一个结构化时间(struct_time)转换为 Unix 时间戳。但是,两者有着微妙的区别,本文将对两者进行比较分析。
更多Python文章,请阅读:Python 教程
什么是 Unix 时间戳
Unix 时间戳是一个整数,表示从1970年1月1日 00:00:00 UTC到现在的秒数。
在Python中,可以使用time模块中的time()函数来获取当前时间的时间戳。
import time
timestamp = time.time()
print(f"当前时间戳为:{timestamp}")
输出:
当前时间戳为:1636424205.0531683
calendar.timegm()函数
calendar.timegm()函数将协调世界时(UTC)的 struct_time 对象转换为 Unix 时间戳。
例如,下面的代码将UTC时间的 struct_time 对象转换为对应的 Unix 时间戳。
import calendar
utc_time = (2021, 11, 9, 16, 0, 0, 1, 313, 0)
timestamp = calendar.timegm(utc_time)
print(f"2021年11月9日16时0分0秒的UTC时间戳为:{timestamp}")
输出:
2021年11月9日16时0分0秒的UTC时间戳为:1636468800
需要注意的是,如果 struct_time 对象表示的是本地时间而不是UTC时间,则无法使用calendar.timegm()函数将其转换为 Unix 时间戳。
time.mktime()函数
time.mktime()函数将本地时间的 struct_time 对象转换为 Unix 时间戳。
例如,下面的代码将本地时间的 struct_time 对象转换为对应的 Unix 时间戳。
import time
local_time = (2021, 11, 9, 16, 0, 0, 1, 313, -1)
timestamp = time.mktime(local_time)
print(f"2021年11月9日16时0分0秒的本地时间戳为:{timestamp}")
输出:
2021年11月9日16时0分0秒的本地时间戳为:1636490400.0
需要注意的是,如果 struct_time 对象表示的是UTC时间而不是本地时间,则无法使用time.mktime()函数将其转换为 Unix 时间戳。
两者的区别
calendar.timegm()函数和time.mktime()函数的区别在于struct_time对象的时区。
calendar.timegm()函数要求struct_time对象必须是UTC时间,而time.mktime()函数要求struct_time对象必须是本地时间。
在 Python 3.3 之前,time模块缺少一个转换 UTC 时间戳的函数,这时就可以使用 calendar.timegm() 函数代替 time.mktime() 函数来将 UTC 的 struct_time 对象转换成 UTC 时间戳。
在 Python 3.3 及以后的版本中,time模块中新增了一个 fromtimestamp() 方法,并且它可以处理 UTC 时间戳。因此,calendar.timegm() 函数和 time.mktime() 函数的用途更加明显。
结论
以上就是 calendar.timegm() 函数和 time.mktime() 函数的介绍,两个函数都可以将 struct_time 对象转换为 Unix 时间戳,只是对 struct_time 对象的时区要求不同,需要根据实际情况选择使用。当然,在 Python 3.3 及以后的版本中,使用 fromtimestamp() 方法更加方便。