解析日期时%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
相关产品推荐
相关产品推荐

