【问题标题】:Parse dates from before the year 1000解析 1000 年前的日期
【发布时间】:2017-09-23 14:58:49
【问题描述】:

考虑以下示例:

from datetime import datetime


FMT = "%Y-%m-%dT%H:%M:%S"

original_date = datetime(1,1,1)

s = original_date.strftime(FMT)  # This is '1-01-01T00:00:00'

当我现在尝试将该字符串解析回日期时间时,使用我最初用来序列化它的确切格式,ValueError 被抛出:

datetime.strptime(s, FMT)

ValueError: 时间数据 '1-01-01T00:00:00' 与格式 '%Y-%m-%dT%H:%M:%S' 不匹配

然而

datetime.strptime('0001-01-01T00:00:00', FMT)

按预期工作。 我本来希望strptime 能够处理strftime 产生的任何东西。我一直认为这些函数是互逆的。

为什么original_date.strftime(FMT) 不会导致零填充年份?这种不一致有什么原因吗?

【问题讨论】:

  • 这是什么 Python 版本?我在 Python 3.6 中得到“0001-01-01T00:00:00”。
  • %Y 匹配 Year with century as a decimal number.(即 4 位数字); %y 匹配 Year without century as a zero-padded decimal number. (但这仍然是 2 位数字)......这不能回答你的问题。但是strptime 将能够反转strftime 生成的所有内容。
  • @SimeonVisser 这很奇怪,我也在使用 Python 3.6。你的补丁版本是多少?
  • @karlson:我正在运行 Python 3.6.1(v3.6.1:69c0db5050,2017 年 3 月 21 日,01:21:04)。
  • @karlson:是的,但我正在运行 Mac OS X。我认为这是这里的问题:bugs.python.org/issue13305

标签: python python-3.x datetime


【解决方案1】:

%Y 的结果在不同平台上不一致。在 Mac OS X 上它会返回 0001,但在 Linux 上它会返回 1

在 Linux 上,您可以使用 %4Y 生成 0001 作为年份值。

这是一个已知问题:https://bugs.python.org/issue13305

strftime()strptime() 的文档还指出:

支持的全套格式代码因平台而异,因为 Python 调用平台 C 库的 strftime() 函数,平台变化很常见。要查看您的平台支持的完整格式代码集,请参阅 strftime(3) 文档。

【讨论】:

  • 注意:strptime() 是用纯 Python 实现的,它是可移植的。另一方面,strftime()(如引文所述)可能使用 C strftime(行为取决于平台)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多