如何在Python中解释一个向往的RFC3339日期时间字符串?

2024-06-06 19:24:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在与一个API接口,该API提供了表示用户生日的year naive RFC 3339日期时间字符串。当然,我想将其解释为某种类型的datetime对象-但是,python datetime库不支持值小于1的日期时间字符串

下面是API给出的一个示例datetime字符串: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在导言中陈述了以下内容:

All dates and times are assumed to be in the "current era", somewhere between 0000AD and 9999AD.

假设该范围包括在内(这是基于本标准中术语“介于之间”的其他用途,尽管从未严格规定),这意味着datetime模块不符合RFC3339标准,因为它硬编码了最小和最大年份值,并使其成为所需值。然而,它从未声称它确实符合标准。所以新的问题是,如果包含的库不支持RFC3339,那么它支持什么

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


Tags: 对象字符串infromimportapidatetime时间
1条回答
网友
1楼 · 发布于 2024-06-06 19:24:17

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

快速查看常见的日期时间替代(PendulumArrow)可以发现,解析带有0000-作为年份的ISO格式字符串时的ValueError错误是通用的。这不是有效的年份,错误在于数据源

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

看来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, 0, 0, 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, 0, 0, tzinfo=datetime.timezone.utc)

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

相关问题 更多 >