Python字符串转带时区ISO8601格式时区偏移异常排查
问题:洛杉矶时区偏移显示异常原因解析
用户编写的Python代码:
from datetime import datetime import pytz some_date = "2019-01-01" tzone = "America/Los_Angeles" print(tzone) iso_datetime = datetime.strptime(some_date , "%Y-%m-%d").replace(tzinfo=pytz.timezone(tzone)).isoformat() # 注:原代码存在语法错误,已修正括号位置
实际输出:
America/Los_Angeles 2019-01-01T00:00:00-07:53
预期输出:
2019-01-01T00:00:00-07:00
异常原因
问题出在replace(tzinfo=pytz.timezone(tzone))这行代码:
- pytz提供的
America/Los_Angeles时区对象包含该时区的历史偏移规则,早期洛杉矶使用本地平均时间(LMT),偏移为UTC-07:53,这是该时区对象的默认初始偏移值。 replace方法只是简单给datetime对象绑定时区对象的默认偏移,不会根据指定的日期(2019-01-01)匹配当时实际生效的时区偏移(UTC-07:00,太平洋标准时间)。
正确解决方法
方法1:使用pytz的localize方法
from datetime import datetime import pytz some_date = "2019-01-01" tzone = "America/Los_Angeles" print(tzone) dt = datetime.strptime(some_date, "%Y-%m-%d") tz = pytz.timezone(tzone) iso_datetime = tz.localize(dt).isoformat() print(iso_datetime)
localize方法会根据传入的datetime日期,匹配时区对应的规则,生成带正确偏移的datetime对象。
方法2:使用Python3.9+内置的zoneinfo模块(推荐)
from datetime import datetime from zoneinfo import ZoneInfo some_date = "2019-01-01" tzone = "America/Los_Angeles" print(tzone) dt = datetime.strptime(some_date, "%Y-%m-%d").replace(tzinfo=ZoneInfo(tzone)) print(dt.isoformat())
zoneinfo的时区对象会自动根据日期匹配正确的偏移,无需额外调用localize方法,用法更简洁。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

