Python解释器在生成ISO 8601格式的日期时间字符串时给出以下内容:
>>> import datetime
>>> datetime.datetime.now().isoformat(timespec='seconds')
'2023-10-12T22:35:02'
请注意,字符串中的“-”字符是一个连字号-减字符。当向后返回生成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格式的datetime字符串是从外部源提供的,比如在GET/POST请求或csv文件中发送的参数,hypens会作为“-”字符发送,这会导致解析中断:
>>> 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'
正确的标准是什么?它是hypen-minus“-”,就像Python在通过.isoformat()或hypen“-"进行转换时给出的那样吗?
两者都接受是最好的做法吗?
2条答案
按热度按时间b1uwtaje1#
ISO 8601标准不是免费公开的。也许有副本的人可以发布一个更明确的答案。
ISO发布了ISO 8601标准的brief summary。摘要始终使用HYPHEN-MINUS(0x 2D)。(感谢Giacomo Catenazzi在评论中指出这一点。
RFC 3339基于ISO 8601,它始终使用HYPHEN-MINUS字符(0x 2D),而不是Unicode HYPHEN字符(0x 2010)。请注意,使用HYPHEN-MINUS(ASCII字符)可以避免不同字符集的问题。
参考:https://datatracker.ietf.org/doc/html/rfc3339
如果您创建的时间戳旨在与ISO 8601一致,则绝对应该使用HYPHEN-MINUS。
如果您收到的时间戳应该是ISO 8601,但它们包含HYPHEN(0x 2010)字符,您可以选择接受它们。您是否应该接受它们取决于项目的要求。如果可能,请要求生成时间戳的人员使用正确的HYPHEN-MINUS字符。一旦你开始接受非标准输入,你可能不得不做大量的工作。
bybem2ql2#
我会推荐ASCII 0x2D,因为ASCII是非常常用的,并且会更少地中断。出于您的目的,如果您关心兼容性,
.replace("\u2010", "-")
将其替换为ASCII,replace("-", "\u2010")
用于ISO 8601。如果你不在乎,就让你的用户去做吧(我推荐ASCII)