微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何在 Python 中解释纯年份、RFC 3339 日期时间字符串?

如何解决我如何在 Python 中解释纯年份、RFC 3339 日期时间字符串?

我正在与一个 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 在其介绍中声明如下:

假定所有日期和时间都在“当前时代”,介于 0000AD 和 9999AD 之间。

假设这个范围是包含的(这是基于标准中术语“之间”的其他用法,虽然它从未被严格规定过),这暗示 datetime 模块不符合 RFC3339 标准作为它对最小和最大年份值进行硬编码,并使其成为必需值。但是,它从未声称它确实符合标准。所以新的问题是,如果包含的库不支持 RFC3339,那怎么办?

我的问题是:有没有办法将此字符串解释为某种日期时间对象或使用第三方库?

解决方法

year 0 日期表示系统中没有 Anno Domini

快速浏览常见的日期时间替代项 (Pendulum,Arrow) 表明解析以 ValueError 为年份的 ISO 格式字符串的 0000- 错误是普遍存在的.那不是一个有效的年份,错误在于数据源。

只有一个月和一天的日期并不是真正的日期 - 它是模棱两可的。日期 2/23 是在 3/1 之前还是之后? 2/23 + 6 天是二月底还是三月初?在这两种情况下,这完全取决于年份。

似乎 Square API 使用 0000- 作为可选年份的标志,因为有些人不想透露他们的年龄。

如果您的数据标准化为第 0000 年,您可能只需进行字符串替换以在第 1 年标准化:

from datetime import datetime

s="0000-09-01T00:00:00-00:00"

>>> datetime.fromisoformat(s.replace("0000-","0001-"))
datetime.datetime(1,9,1,tzinfo=datetime.timezone.utc)

或者,如评论中所述,也许使用 0004 来容纳 2/29 作为生日:

s="0000-02-29T00:00:00-00:00"

>>> datetime.fromisoformat(s.replace("0000-","0004-"))
datetime.datetime(4,2,29,tzinfo=datetime.timezone.utc)

这充其量只是部分解决方案。同样,没有年份的日期不是日期,您需要编写和验证大量代码来尝试解决排序、比较、日期偏移、表示等方面的歧义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?