Python如何创建指定时区的datetime?为何偏移为-04:56而非-04:00?
问题:纽约时区datetime实例偏移为何是-04:56而非预期的-04:00?
你的代码及输出
代码:
import pytz from datetime import datetime as dt targettz = pytz.timezone('America/New_York') d1 = dt(2024, 1, 1, 7, 40, 0, tzinfo=targettz) d1.isoformat()
输出:
'2024-01-01T07:40:00-04:56'
原因解析
直接把pytz的时区对象传给datetime的tzinfo参数是错误用法。pytz的时区对象包含该地区历史时区偏移数据(比如纽约早年使用的西经74度本地平太阳时,偏移正好是-04:56),而标准库datetime构造器不会根据传入的日期自动匹配正确的时区规则,只会读取时区对象的默认基础偏移值,这就导致了不符合预期的结果。
另外需要纠正一个误区:2024年1月1日纽约处于冬令时(EST),正确偏移应该是-05:00;-04:00是夏令时(EDT)的偏移,通常在每年3月到11月生效。
正确实现方式
方式1:使用pytz的localize方法
pytz专门提供了localize方法来为datetime对象绑定正确的时区规则:
import pytz from datetime import datetime as dt targettz = pytz.timezone('America/New_York') d1 = targettz.localize(dt(2024, 1, 1, 7, 40, 0)) print(d1.isoformat()) # 输出:'2024-01-01T07:40:00-05:00'
方式2:使用Python3.9+标准库zoneinfo(推荐)
Python3.9及以上版本引入了标准库zoneinfo,无需依赖第三方库,用法更直观且避免pytz的这类问题:
from zoneinfo import ZoneInfo from datetime import datetime as dt d1 = dt(2024, 1, 1, 7, 40, 0, tzinfo=ZoneInfo('America/New_York')) print(d1.isoformat()) # 输出:'2024-01-01T07:40:00-05:00'
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

