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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:27:52