【发布时间】:2021-03-13 17:01:32
【问题描述】:
我正在与一个 API 交互,该 API 提供原始 RFC 3339 日期时间字符串来表示用户生日。自然,我想将此解释为某种 datetime 对象 - 但是,python datetime 库不支持值小于 1 的日期时间字符串。
以下是 API 给出的示例日期时间字符串:0000-09-01T00:00:00-00:00(注意年份设置为 0000)。如果我只是把它扔进datetime.fromisoformat,不出所料会引发错误:
In [1]: from datetime import datetime
In [2]: datetime.fromisoformat("0000-09-01T00:00:00-00:00")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-2-e1d8a5624d92> in <module>
----> 1 datetime.fromisoformat("0000-09-01T00:00:00-00:00")
ValueError: year 0 is out of range
如果我要完全删除字符串的年份部分,它会给出以下内容:
In [1]: from datetime import datetime
In [2]: datetime.fromisoformat("09-01T00:00:00-00:00")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-2-a027335f00c1> in <module>
----> 1 datetime.fromisoformat("09-01T00:00:00-00:00")
ValueError: Invalid isoformat string: '09-01T00:00:00-00:00'
起初,我认为这是一个错误或限制。但经过一番研究,我发现RFC3339 Standard 在其简介中声明了以下内容:
所有日期和时间都假定为“当前时代”,介于公元 0000 年和公元 9999 年之间。
假设这个范围是包容性的(这是基于标准中“介于”一词的其他用法,尽管从未严格指定),暗示 datetime 模块不符合 RFC3339 标准它硬编码最小和最大年份值,并使其成为必需值。但是,它从未声称它确实符合标准。所以新的问题是,如果包含的库不支持 RFC3339,那是什么?
我的问题是:有没有办法将此字符串解释为某种日期时间对象或使用第三方库?
【问题讨论】:
-
没有第 0 年。公元 1 年紧随公元前 1 年。
-
是的,我知道。但是,我无法控制 API 提供的数据。
-
您链接到的文档用于 API,而不是 Python
datetime库。 -
为什么不用“缺失值标识符”替换年份,例如
replace('0000', '2996')?希望这个代码在几百年后不会继续使用...... -
无论如何,“API 不符合 RFC 3339”的说法是错误的。 API 合规,
datetime.fromisoformat()不合规。但它并没有声称是。