使用pytz模块处理时区时2037年后夏令时识别失效问题
布鲁塞尔时区2038年后夏令时识别失效问题
我写了一段处理datetime的代码,2037年之前的日期能正确识别布鲁塞尔时区的夏令时(DST),但2038年及之后的日期无法识别夏令时。
代码实现
def date_time_conversion(str_dt): brussels = pytz.timezone("Europe/Brussels") converted_date = datetime.strptime(str_dt, '%Y.%m.%d %H.%M.%S') b = brussels.localize(converted_date) return b
测试示例
正确识别夏令时(2037年前)
- 调用:
date_time_conversion('2036.08.05 00:00:00')
输出:datetime.datetime(2037, 8, 5, 0, 0, tzinfo=<DstTzInfo 'Europe/Brussels' CEST+2:00:00 DST>) - 调用:
date_time_conversion('2036.01.05 00:00:00')
输出:datetime.datetime(2037, 8, 5, 0, 0, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>)
夏令时识别失效(2038年及之后)
- 调用:
date_time_conversion('2038.08.05 00:00:00')
输出:datetime.datetime(2038, 5, 0, 0, 0, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>) - 调用:
date_time_conversion('2038.01.05 00:00:00')
输出:datetime.datetime(2038, 1, 5, 0, 0, tzinfo=<DstTzInfo 'Europe/Brussels' CET+1:00:00 STD>)
问题原因
核心问题是pytz依赖的时区数据版本过旧。时区规则(包括夏令时的起止日期)会随各国政策调整而更新,旧版tzdata包可能没有收录2038年后布鲁塞尔的夏令时规则,导致pytz无法正确识别该年份的DST状态。
解决方案
- 更新tzdata包
pytz现在依赖独立的tzdata包提供时区数据,执行以下命令更新到最新版本:
pip install --upgrade tzdata
- 改用标准库zoneinfo(Python 3.9+)
Python 3.9及以上版本推荐使用标准库的zoneinfo模块,它默认会使用系统或安装的最新tzdata数据,稳定性更强:
from zoneinfo import ZoneInfo from datetime import datetime def date_time_conversion(str_dt): converted_date = datetime.strptime(str_dt, '%Y.%m.%d %H.%M.%S') return converted_date.replace(tzinfo=ZoneInfo("Europe/Brussels"))
- 验证修复效果
更新后可以执行以下代码验证2038年8月的时区是否正确识别为夏令时:
from zoneinfo import ZoneInfo dt = datetime(2038, 8, 5, 0, 0, tzinfo=ZoneInfo("Europe/Brussels")) print(dt.tzinfo) # 预期输出:<ZoneInfo 'Europe/Brussels' CEST+2:00:00 DST>
内容的提问来源于stack exchange,提问作者Abhishek Singh
相关产品推荐
相关产品推荐

