Python 3中不依赖pytz将EST日期时间转UTC时间戳
Python 3 无第三方库实现美东时间字符串转UTC时间戳
你之前用pytz得到不准确结果,核心原因大概率是误用了固定偏移的EST时区标识——这个标识对应固定UTC-5偏移,完全不覆盖美国东部时间的夏令时规则:美国东部时间冬令时为EST(UTC-5),夏令时为EDT(UTC-4),每年3月中到11月初实行夏令时,硬编码固定偏移必然在夏令时区间出现1小时误差。
Python 3.9+ 标准库自带zoneinfo模块,内置完整IANA时区数据,无需安装任何第三方库即可准确完成带夏令时的时区转换,步骤如下:
- 第一步:用
datetime.strptime解析输入的时间字符串,得到无时区信息的朴素时间对象 - 第二步:给朴素时间对象绑定
America/New_York时区(IANA标准美东时区标识,会自动匹配对应日期的EST/EDT偏移,不要用缩写EST) - 第三步:将绑定了美东时区的时间对象转换为UTC时区
- 第四步:调用
timestamp()方法直接得到UTC时间戳
代码示例
from datetime import datetime from zoneinfo import ZoneInfo # 输入的美东时间字符串 time_str = '2020-02-02 09:30:00' # 解析字符串为无时区信息的朴素时间对象 naive_et_dt = datetime.strptime(time_str, '%Y-%m-%d %H:%M:%S') # 绑定美东时区,自动适配对应日期的冬/夏令时偏移 aware_et_dt = naive_et_dt.replace(tzinfo=ZoneInfo('America/New_York')) # 直接获取UTC时间戳 utc_timestamp = aware_et_dt.timestamp()
结果验证
以上述2020-02-02的日期为例,该日期处于冬令时区间,美东时间比UTC晚5小时,转换后的UTC时间为2020-02-02 14:30:00,对应时间戳为1580653800.0,结果准确。如果传入夏令时区间的日期,比如2020-07-02 09:30:00,代码会自动按UTC-4偏移计算,对应UTC时间为2020-07-02 13:30:00,不会出现固定偏移导致的1小时误差。
避坑说明
- 不要使用
ZoneInfo('EST')或者硬编码UTC-5偏移做转换,夏令时期间结果必然错误 - 不要用
datetime.astimezone()给朴素时间对象绑定时区,该方法会默认把朴素时间识别为系统本地时区做转换,结果会出现偏差,必须用replace(tzinfo=...)绑定原始字符串对应的时区
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

