为什么datetime.now(datetime.timezone.utc)与utcnow()时间戳存在差异
差异原因
核心问题出在两个datetime对象的时区属性,以及timestamp()方法对不同类型datetime的处理逻辑上:
datetime.datetime.now(datetime.timezone.utc)返回的是带UTC时区标记的aware datetime对象,它本身明确存储了时区信息,调用timestamp()时会直接基于UTC时区计算对应的Unix时间戳,结果完全准确。datetime.datetime.utcnow()返回的是没有时区标记的naive datetime对象,它的值虽然是当前的UTC时间,但Python无法识别它属于哪个时区,调用timestamp()时会默认把它当做代码运行设备的本地时区的时间来计算时间戳。
你测试环境得到的差值约为-18000秒(即-5小时),正好说明你运行代码的设备本地时区为UTC-5(比UTC慢5小时):
举个例子,假设当前UTC时间为2021-09-08 01:33:00,对应的Unix时间戳记为T:
now(utc)得到的时间为2021-09-08 01:33:00+00:00,调用timestamp()得到的结果就是Tutcnow()得到的naive时间为2021-09-08 01:33:00,Python会把它当做UTC-5时区的2021-09-08 01:33:00,这个时间对应的UTC实际为2021-09-08 06:33:00,对应的时间戳为T + 18000- 二者相减的结果就是T - (T + 18000) = -18000,小数点后的微小差异是两次函数调用的间隔时间导致的误差。
注意
Python官方已经不推荐使用utcnow(),涉及UTC时间的场景都建议用datetime.datetime.now(datetime.timezone.utc)获取带时区标记的时间,避免时区歧义导致的bug。
内容的提问来源于stack exchange,提问作者étale-cohomology
相关产品推荐
相关产品推荐

