UTC时间串转Unix时间戳再转回后结果不一致的技术问题
问题根源
你用datetime.strptime生成的utc_time是个不带时区信息的朴素datetime对象。调用timestamp()时,Python会默认把这个对象当成你本地时区的时间来计算时间戳,而不是你输入的UTC时间——这就是转换后时间偏移的原因。
修复方法
方法1:解析时直接绑定UTC时区
给解析出的朴素datetime对象加上UTC时区标记,让timestamp()明确知道这是UTC时间:
from datetime import datetime import pytz utc = '2023-09-20T05:04:54' # 解析后直接绑定UTC时区 utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=pytz.utc) utc_dn = utc_time.timestamp() utc_back = datetime.fromtimestamp(utc_dn, tz=pytz.utc) utc_str_back = utc_back.strftime('%Y-%m-%d %H:%M:%S %Z') # 此时输出为:'2023-09-20 05:04:54 UTC'
方法2:用utcfromtimestamp转换回时间
如果不想在解析时处理时区,转换回datetime时用utcfromtimestamp,它会直接把时间戳当作UTC时间解析:
from datetime import datetime import pytz utc = '2023-09-20T05:04:54' utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S') utc_dn = utc_time.timestamp() # 用utcfromtimestamp替代fromtimestamp,无需指定时区 utc_back = datetime.utcfromtimestamp(utc_dn) utc_str_back = utc_back.strftime('%Y-%m-%d %H:%M:%S UTC') # 此时输出为:'2023-09-20 05:04:54 UTC'
进阶推荐:Python 3.9+用zoneinfo替代pytz
如果你的Python版本在3.9及以上,建议用标准库的zoneinfo代替第三方的pytz,用法更简洁规范:
from datetime import datetime from zoneinfo import ZoneInfo utc = '2023-09-20T05:04:54' utc_time = datetime.strptime(utc, '%Y-%m-%dT%H:%M:%S').replace(tzinfo=ZoneInfo('UTC')) utc_dn = utc_time.timestamp() utc_back = datetime.fromtimestamp(utc_dn, tz=ZoneInfo('UTC')) utc_str_back = utc_back.strftime('%Y-%m-%d %H:%M:%S %Z') # 此时输出为:'2023-09-20 05:04:54 UTC'
内容的提问来源于stack exchange,提问作者Qinghuan Li
相关产品推荐
相关产品推荐

