提问人:deadlock 提问时间:10/13/2023 最后编辑:Remy Lebeaudeadlock 更新时间:10/19/2023 访问量:78
ISO 8601 日期时间应该使用 hypen-minus (U+002D) 还是 hypen (U+2010)?
Should hypen-minus (U+002D) or hypen (U+2010) be used for ISO 8601 datetimes?
问:
Python 解释器在生成 ISO-8601 格式的日期/时间字符串时提供以下内容:
>>> import datetime
>>> datetime.datetime.now().isoformat(timespec='seconds')
'2023-10-12T22:35:02'
请注意,字符串中的“-”字符是 hypen-minus 字符。当向后生成 datetime 对象时,我们执行以下操作:
>>> 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 请求或文件中发送的参数,连字符将作为 (U+2010) 字符发送,这会导致解析中断:.csv
‐
>>> 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 在通过 转换时给出的 hypen-minus U+002D 还是 hypen U+2010?-
.isoformat()
‐
最好同时接受两者吗?
答:
我建议使用 ASCII 0x2D,因为 ASCII 非常常用,并且会更少中断。出于您的目的,如果您关心兼容性,请将其替换为 ASCII,用于 ISO 8601。如果你不在乎,就让你的用户去做(我推荐ASCII).replace("\u2010", "-")
replace("-", "\u2010")
评论
ISO 8601 标准不是免费公开的。也许有副本的人可以发布更明确的答案。
ISO 发布了 ISO 8601 标准的简要摘要。摘要始终使用 HYPHEN-MINUS (0x2D)。(感谢 Giacomo Catenazzi 在评论中指出这一点。
RFC 3339 基于 ISO 8601,它始终使用 HYPHEN-MINUS 字符 (0x2D),而不是 Unicode HYPHEN 字符 (0x2010)。请注意,使用 HYPHEN-MINUS(ASCII 字符)可以避免出现不同字符集的问题。
参考资料: https://datatracker.ietf.org/doc/html/rfc3339
如果创建的时间戳旨在与 ISO 8601 保持一致,则绝对应使用 HYPHEN-MINUS。
如果您收到的时间戳本应是 ISO 8601,但它们包含连字符 (0x2010) 字符,则可以选择接受它们。是否应该接受它们取决于项目的要求。如果可能,请询问生成时间戳的人员使用正确的连字符-减号字符。一旦你开始接受非标准输入,你可能不得不做大量的工作。
评论
上一个:使用 jq 设置日期时间的格式
评论