You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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状态。

解决方案

  1. 更新tzdata包
    pytz现在依赖独立的tzdata包提供时区数据,执行以下命令更新到最新版本:
pip install --upgrade tzdata
  1. 改用标准库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"))
  1. 验证修复效果
    更新后可以执行以下代码验证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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:33:13