Python带相同时区信息的两个datetime对象打印结果不一致问题及解决
问题描述
我想要将Python的datetime对象时区从US/Eastern转换为UTC。我先创建了带US/Eastern时区的datetime对象,将其转换为UTC时区后再转回US/Eastern时区,预期首尾两个US/Eastern时区的datetime对象完全一致,但实际二者打印结果不同,请问我遗漏了什么?
复现代码
from datetime import datetime import pytz tz_local = pytz.timezone('US/Eastern') tz_utc = pytz.utc datestring = '20210701' timestring = '04:00:00' hour, minute, sec = timestring.split(':') hour, minute, sec = list(map(int, [hour, minute, sec])) # 从原始字符串生成不带时区的naive datetime对象 date_naive = datetime.strptime(datestring, '%Y%m%d') time_naive = date_naive.replace(hour=hour, minute=minute, second=sec) # 为对象添加US/Eastern本地时区信息 time_local = time_naive.replace(tzinfo=tz_local) # 转换为UTC时区 time_utc = time_local.astimezone(tz_utc) # 转回US/Eastern时区 time_local_rev = time_utc.astimezone(tz_local) print(time_local.strftime('%Y-%m-%d %H:%M:%S %Z%z')) print(time_local_rev.strftime('%Y-%m-%d %H:%M:%S %Z%z'))
错误输出
2021-07-01 04:00:00 LMT-0456 2021-07-01 04:56:00 EDT-0400
解决方案
使用.localize方法代替.replace为naive datetime对象添加时区信息即可解决问题,修改后的代码片段如下:
# 为对象添加US/Eastern本地时区信息 time_local = tz_local.localize(time_naive)
修改后输出
2021-07-01 04:00:00 EDT-0400 2021-07-01 04:00:00 EDT-0400
内容的提问来源于stack exchange,提问作者hskim__
相关产品推荐
相关产品推荐

