You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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__

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:15:05