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

为何datetime.replace()设置的时区偏移量不正确?

字符串日期转UTC时时区偏移错误问题

我在将字符串日期转换为UTC时遇到问题,代码如下:

from datetime import datetime as dt2
import pytz

fmt_str: str = "%Y-%m-%d %H:%M:%S"
email_date = "2023-05-24 16:12:00"

est_tz = pytz.timezone("US/Eastern")
america_tz = pytz.timezone("America/New_York")

est_dt_obj = dt2.strptime(email_date, '%Y-%m-%d %H:%M:%S').replace(tzinfo=est_tz)
america_dt_obj = dt2.strptime(email_date, '%Y-%m-%d %H:%M:%S').replace(tzinfo=america_tz)

print(est_dt_obj)
## prints 2023-05-24 16:12:00-04:56

print(america_dt_obj)
## prints 2023-05-24 16:12:00-04:56

我收到的email_date始终为EST/EDT时区,尝试为该日期分配对应时区后,得到的UTC偏移量不正确(预期偏移应为-4而非-4:56)。最终目标是将该时间转换为UTC后存入数据库,怀疑是时区设置方式有误。我还想到另一种方案:根据日期判断是否处于夏令时,再使用ETC/GMT+4或ETC/GMT+5时区。


问题原因与解决方法

问题根源

用datetime.replace(tzinfo=...)给datetime对象绑定pytz时区时,会使用该时区的历史偏移量(比如美国东部早期的时区偏移不是整小时),而非对应日期实际应使用的标准偏移量,这就是你得到-4:56而非-4的原因。

正确的时区绑定方式

不要用replace,改用pytz时区对象的localize方法,它会自动根据日期选择正确的时区偏移(区分EST/EDT):

from datetime import datetime as dt2
import pytz

email_date = "2023-05-24 16:12:00"
ny_tz = pytz.timezone("America/New_York")

# 用localize绑定时区
ny_dt_obj = ny_tz.localize(dt2.strptime(email_date, '%Y-%m-%d %H:%M:%S'))
print(ny_dt_obj)
# 输出:2023-05-24 16:12:00-04:00

# 转换为UTC
utc_dt = ny_dt_obj.astimezone(pytz.utc)
print(utc_dt)
# 输出:2023-05-24 20:12:00+00:00

关于夏令时判断的方案

不建议手动判断夏令时再切换ETC/GMT+X时区,这种方式需要自己维护夏令时规则,容易出错。localize方法已经自动处理了夏令时的偏移切换,是更可靠的方案。


内容的提问来源于stack exchange,提问作者jsunhuntlib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:10:09