【问题标题】:Does datetime.isoformat() really conform to ISO-8601?datetime.isoformat() 真的符合 ISO-8601 吗?
【发布时间】:2021-12-29 13:58:19
【问题描述】:

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

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

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

有更好的想法吗?

感谢您的帮助!

【问题讨论】:

  • 不,Python 文档没有骗你,标准允许秒数包含你所指的小数部分(不是时区/偏移量)
  • @IainShelvington 不确定我是否误解了你:) Python 文档中指定的isoformat() 返回的完整模式是YYYY-MM-DDTHH:MM:SS.ffffff+HH:MM[:SS[.ffffff]]。我的问题是指在+右侧的部分,在我的理解中时区/偏移量。
  • @JasonS 虽然这个答案很好地解释了为什么存在亚分钟偏移,但我选择了下面的答案,因为它引用了datetime.isoformat 的标准并确认 python 文档的问题。不过在评论中提到了你的答案:)

标签: python python-3.x python-datetime iso8601


【解决方案1】:

ISO 8601 仅允许使用小时和分钟的 UTC 偏移量。来自spec

4.2.5.2 当地时间和与 UTC 的时差

...

当地时间与UTC的时标之差为 以小时和分钟表示,或仅以小时表示,独立于 与其相关的本地时间表达式的准确性。

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

【讨论】:

  • 感谢您引用源代码!还回答 [为什么 Java 支持以秒为精度的时区偏移?][stackoverflow.com/a/55810943/4080347](上面提到的 Jason S 解释了为什么存在亚分钟分辨率。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 2011-01-13
  • 2016-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多