使用strptime()解析两位数年份的生日效果不佳

6 投票
3 回答
5498 浏览
提问于 2025-04-16 01:31

考虑以下的出生日期(用 dob 表示):

  • 1968年6月1日
  • 1969年6月1日

当使用Python的 datetime.strptime(dob, '%d-%b-%y') 来解析这些日期时,结果会是:

  • datetime.datetime(2068, 6, 1, 0, 0)
  • datetime.datetime(1969, 6, 1, 0, 0)

当然,它们应该是在同一个十年出生的,但现在居然不在同一个世纪了!

根据文档,这种情况是完全正常的:

当接受两位数的年份时,它们会根据POSIX或X/Open标准进行转换:69到99的值会被映射到1969到1999,而0到68的值会被映射到2000到2068。

我明白这个函数为什么会这样设置,但有没有办法解决这个问题呢?也许可以通过定义自己的两位数年份范围来实现?

3 个回答

0

如果你在等着过生日,你可以手动调整一下数据——把任何未来的日期都自动改成一百年前的日期,或者类似的做法。

2

这个函数的作用是把年份调整到1950年:

def millenium(year, shift=1950):
    return (year-shift)%100 + shift
12

如果你总是用它来计算生日的话,只需要在年份晚于现在的时候减去100就可以了:

if d > datetime.now():
    d = datetime(d.year - 100, d.month, d.day)

撰写回答