为何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
相关产品推荐
相关产品推荐

