datetime.isoformat() 真的符合 ISO-8601 吗?

Does datetime.isoformat() really conform to ISO-8601?

根据python docsdatetime.toisoformat() returns表示日期和时间的字符串采用ISO 8601格式,但输出格式字符串可能会将 UTC 偏移量部分格式化为 +HH:MM[:SS[.ffffff]]。我看了又看,但在任何地方都找不到 [:SS[.ffffff]] 是标准的一部分,并且某些第 3 方工具无法解析以这种方式格式化的字符串。这包括 dateutil 包,官方 python 文档将其称为“功能更全的 ISO 8601 解析器”。有人可以解释发生了什么吗,python 是在文档中直接向我们撒谎吗? ;)

如果我是对的,我想 python 的文档应该更新以提及这一点,但另一个问题是如何正确检测给定的日期时间对象是否可以表示为有效的 ISO 8601 字符串.总是有检查输出字符串的脏选项,但我想知道是否存在更优雅的东西 :) 我试过了:

  1. (dt.utcoffset().total_seconds() / 60).is_integer() 很简单,但我真的不相信以这种方式检查有多少浮点数接近整数。
  2. dt.utcoffset().microseconds == 0 and dt.utcoffset().seconds % 60 == 0 似乎不太容易出错,但我不确定根据模块化算法它是否正确。

有更好的主意吗?

感谢帮助!

ISO 8601 仅允许使用小时和分钟进行 UTC 偏移。来自 spec:

4.2.5.2 Local time and the difference from UTC

...

The difference between the time scale of local time and UTC shall be expressed in hours-and-minutes, or hours-only independent of the accuracy of the local time expression associated with it.

所以你是对的 datetime.isoformat 并不总是产生 ISO 8601 兼容的 UTC 偏移量。