ISO 8601 日期时间应该使用连字符减号 (U+002D) 还是连字符 (U+2010)?

问题描述 投票:0回答:2

Python 解释器在生成 ISO-8601 格式的日期/时间字符串时给出以下内容:

>>> import datetime
>>> datetime.datetime.now().isoformat(timespec='seconds')
'2023-10-12T22:35:02'

请注意,字符串中的“-”字符是连字符减号。当向后生成日期时间对象时,我们执行以下操作:

>>> datetime.datetime.strptime('2023-10-12T22:35:02', '%Y-%m-%dT%H:%M:%S')
datetime.datetime(2023, 10, 12, 22, 35, 2)

这一切都检查完毕。

但是,有时当从外部源提供 ISO-8601 格式的日期/时间字符串时,例如在 GET/POST 请求中或在

.csv
文件中发送的参数,连字符将作为
 发送
(U+2010) 字符,这会导致解析中断:

>>> datetime.datetime.strptime('2023‐10‐12T22:35:02', '%Y-%m-%dT%H:%M:%S')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '2023‐10‐12T22:35:02' does not match format '%Y-%m-%dT%H:%M:%S'

正确的标准是什么?是通过

-
转换时 Python 给出的连字符减号
.isoformat()
U+002D,还是连字符
U+2010?

两者都接受是最佳做法吗?

python datetime unicode ascii iso8601
2个回答
4
投票

ISO 8601 标准不是免费公开的。也许有副本的人可以发布更明确的答案。

ISO 发布了 ISO 8601 标准的摘要。摘要始终使用连字符减号 (0x2D)。 (感谢 Giacomo Catenazzi 在评论中指出了这一点。)

RFC 3339 基于 ISO 8601,并且始终使用连字符减号字符 (0x2D),而不是 Unicode 连字符字符 (0x2010)。请注意,使用 HYPHEN-MINUS(ASCII 字符)可以避免不同字符集出现的问题。

参考:https://datatracker.ietf.org/doc/html/rfc3339

如果您创建的时间戳旨在与 ISO 8601 一致,则绝对应该使用连字符减号。

如果您收到的时间戳应该是 ISO 8601,但其中包含连字符 (0x2010),您可以选择接受它们。您是否应该接受它们取决于您的项目的要求。如果可能,请询问生成时间戳的人员使用正确的连字符减号。一旦开始接受非标准输入,您可能需要做大量的开放式工作。


-1
投票

我会推荐 ASCII 0x2D,因为 ASCII 非常常用,而且破坏较少。出于您的目的,如果您关心兼容性,请

.replace("\u2010", "-")
将其替换为 ASCII,
replace("-", "\u2010")
替换为 ISO 8601。如果您不关心,就让您的用户这样做(我推荐 ASCII)

© www.soinside.com 2019 - 2024. All rights reserved.