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

解析日期时%y指令的具体解析规则是什么?

关于%y日期解析的世纪规则详解

这个问题问得太戳痛点了——我当初第一次用两位年份解析日期的时候,也对着%y的文档一脸懵:“不带世纪的年份”?那到底默认绑定哪个世纪啊!

以Python为例的核心规则(从你写的for year in range...代码能看出是用Python)

Python的datetime.strptime()处理%y时,遵循固定的世纪映射逻辑(Python 3.2+版本生效):

  • 两位年份为00-69时,自动映射到2000-2069
  • 两位年份为70-99时,自动映射到1970-1999

举个实际的例子:现在(2024年)运行代码解析01,得到的是2001;解析70,得到的是1970;69对应2069,但70直接跳去1970年。

至于你问的“100年后运行相同代码,解析01会不会是2101?”——按照目前的规则来看,不会!这个阈值是硬编码在Python的日期模块里的,不是动态基于当前年份调整的。除非未来Python官方修改了这个规则,否则100年后解析01依然会得到2001,70还是对应1970。

验证实验代码(就是你提到的遍历测试)

你可以用这段代码直观看到0-99所有两位年份的解析结果:

from datetime import datetime

for two_digit_year in range(100):
    # 把数字格式化为带前导零的两位年份字符串,比如1变成"01"
    date_str = f"01/01/{two_digit_year:02d}"
    parsed_date = datetime.strptime(date_str, "%m/%d/%y")
    print(f"解析 '{date_str}' → {parsed_date.year}")

运行后你会清晰看到前70个年份(00-69)都落在20xx区间,后30个(70-99)则归到19xx区间。

自定义世纪映射的补充方案

如果你的业务需要更灵活的规则(比如想让00-49对应2000-2049,50-99对应1950-1999),就不能依赖%y的默认逻辑了,得手动处理:

from datetime import datetime

def parse_custom_two_digit_year(date_str):
    parsed = datetime.strptime(date_str, "%m/%d/%y")
    # 自定义阈值:两位年份>=50时,切换到19世纪
    if parsed.year >= 2050:
        parsed = parsed.replace(year=parsed.year - 100)
    return parsed

# 测试:解析"01/01/50"会得到1950
print(parse_custom_two_digit_year("01/01/50").year)  # 输出1950

内容的提问来源于stack exchange,提问作者Aran-Fey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:33:55