Python datetime与int互相转换出现2小时偏差问题如何解决?
问题原因
2小时偏差本质是时区处理不一致导致的:
datetime.datetime.now()返回不带时区信息的naive datetime,值为你设备的本地时区时间calendar.timegm()的作用是将UTC时区的时间元组转换为Unix时间戳,你传入本地时间的元组时,它会错误地把本地时间当做UTC时间计算时间戳datetime.datetime.fromtimestamp()是将Unix时间戳转换为你设备的本地时区时间,两个步骤的时区基准不统一就出现了固定的时区偏移,你这里的2小时就是你当前时区和UTC的时差。
修复方案
方案1:全程使用UTC时间处理(更推荐,跨时区场景不会出错)
import datetime import calendar def test_time_conversion(): # 直接获取UTC时间,避免本地时区干扰 now = datetime.datetime.utcnow().replace(microsecond=0) time_now_decimal = calendar.timegm(now.timetuple()) # 用utcfromtimestamp将时间戳转回UTC时间 dt = datetime.datetime.utcfromtimestamp(time_now_decimal) time_expected_decimal = calendar.timegm(dt.replace(microsecond=0).timetuple()) print("\n") print(now) print(time_now_decimal) print(dt) print(time_expected_decimal)
方案2:全程使用本地时间处理
如果需要保留本地时间的结果,使用time.mktime替代calendar.timegm即可,time.mktime是专门用来处理本地时区时间元组转时间戳的:
import datetime import time def test_time_conversion(): now = datetime.datetime.now().replace(microsecond=0) # 用mktime处理本地时间元组 time_now_decimal = time.mktime(now.timetuple()) dt = datetime.datetime.fromtimestamp(time_now_decimal) time_expected_decimal = time.mktime(dt.replace(microsecond=0).timetuple()) print("\n") print(now) print(time_now_decimal) print(dt) print(time_expected_decimal)
内容的提问来源于stack exchange,提问作者Adelin
相关产品推荐
相关产品推荐

