python ISO 8601日期时间应该使用hypen-minus(0x 2D)还是hypen(0x 2010)?

1l5u6lss  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(81)

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“-"进行转换时给出的那样吗?
两者都接受是最好的做法吗?

b1uwtaje

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字符。一旦你开始接受非标准输入,你可能不得不做大量的工作。

bybem2ql

bybem2ql2#

我会推荐ASCII 0x2D,因为ASCII是非常常用的,并且会更少地中断。出于您的目的,如果您关心兼容性,.replace("\u2010", "-")将其替换为ASCII,replace("-", "\u2010")用于ISO 8601。如果你不在乎,就让你的用户去做吧(我推荐ASCII)

相关问题