使用 strptime() 的 2 位数年份无法很好地解析生日

发布于 2024-09-10 11:31:39 字数 612 浏览 12 评论 0原文

考虑以下生日(如 dob):

  • 1-Jun-68
  • 1-Jun-69

当使用 Python 的 datetime.strptime(dob, '%d-%b-%y') 进行解析时 将产生:

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

好吧当然,他们应该出生在同一个十年,但现在甚至不在同一个世纪!

根据 docs 这是完全有效的行为:

当接受 2 位数年份时,它们将根据 POSIX 或 X/Open 标准:值 69-99 映射到 1969-1999, 值 0–68 映射到 2000–2068。

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

Consider the following birthdays (as dob):

  • 1-Jun-68
  • 1-Jun-69

When parsed with Python’s datetime.strptime(dob, '%d-%b-%y') will yield:

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

Well of course they’re supposed to be born in the same decade but now it’s not even in the same century!

According to the docs this is perfectly valid behaviour:

When 2-digit years are accepted, they are converted according to
the POSIX or X/Open standard: values 69-99 are mapped to 1969-1999,
and values 0–68 are mapped to 2000–2068.

I understand why the function is set up like this but is there a way to work around this? Perhaps with defining your own ranges for 2-digit years?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

凝望流年 2024-09-17 11:31:39

如果您总是在生日时使用它,那么如果年份是现在以后的话,只需减去 100:

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

If you're always using it for birthdays, just subtract 100 if the year is after now:

if d > datetime.now():
    d = datetime(d.year - 100, d.month, d.day)
染柒℉ 2024-09-17 11:31:39

此函数将年份移至 1950 年:

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

This function shifts the year to 1950:

def millenium(year, shift=1950):
    return (year-shift)%100 + shift
青衫儰鉨ミ守葔 2024-09-17 11:31:39

如果您预计生日,您总是可以手动修改数据 - 未来的任何日期都会自动回退一个世纪,或类似的情况。

If you're expecting a birthday, you could always just manually massage the data - any date in the future is automatically set back a century, or some such.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文