Python中strptime处理两位年份为何69返回1969?如何获取2070?
问题原因
这事儿其实是Python依赖的底层C库日期解析规则在搞鬼——默认情况下,strptime用2069作为两位年份的截止点:
- 两位年份
00-68会被自动映射到2000-2068 - 两位年份
69-99则会被映射到1969-1999
这就是你输入1268得到2068,但1269却返回1969的核心原因。
解决方法(仅用两位年份处理)
如果你的需求是让69-99对应2069-2099(比如要得到2070),这里有两种实用的实现方式:
方式1:手动替换年份(精准控制)
解析日期后,直接根据输入的两位年份调整对应的世纪:
from datetime import datetime def expdate(date): parsed_date = datetime.strptime(date, "%m%y") two_digit_year = int(date[-2:]) # 把69-99的两位年份映射到2000+年份 if two_digit_year >= 69: parsed_date = parsed_date.replace(year=2000 + two_digit_year) return parsed_date
测试效果:
>>> expdate('1268') 2068-12-01 00:00:00 >>> expdate('1269') 2069-12-01 00:00:00 >>> expdate('1270') 2070-12-01 00:00:00
方式2:强制映射到20世纪(更直接)
如果你的业务场景中所有两位年份都应该属于2000-2099,完全可以跳过默认规则,直接手动构造年份:
from datetime import datetime def expdate(date): # 先解析月份和默认年份 parsed_date = datetime.strptime(date, "%m%y") # 强制替换为2000 + 两位年份 parsed_date = parsed_date.replace(year=2000 + int(date[-2:])) return parsed_date
这种方式简单直接,完全不受默认截止规则的影响,确保所有两位年份都落在2000-2099区间内。
灵活调整的扩展思路
如果需要兼容19xx年份(比如某些老数据),可以基于当前年份设置动态阈值,比如:
from datetime import datetime def expdate(date): parsed_date = datetime.strptime(date, "%m%y") current_year = datetime.now().year # 把阈值设为当前年份+50年的后两位,比如当前是2024,50年后是2074,那么>=74的两位年份对应20xx,否则19xx threshold = (current_year + 50) % 100 two_digit_year = int(date[-2:]) if two_digit_year >= threshold: parsed_date = parsed_date.replace(year=2000 + two_digit_year) else: parsed_date = parsed_date.replace(year=1900 + two_digit_year) return parsed_date
这种方式能自动适配未来年份,避免几年后阈值过时的问题。
内容的提问来源于stack exchange,提问作者void
相关产品推荐
相关产品推荐

