ISO 8601 日期时间应该使用连字符减号 (0x2D) 还是连字符 (0x2010)?

问题描述 投票: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 文件中发送的参数)时,连字符会作为“‐”字符发送,这会导致解析中断:

>>> 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'

正确的标准是什么?通过 .isoformat() 转换时,它是 Python 给出的连字符减号“-”还是连字符“‐”?

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

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

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

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


0
投票

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

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

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

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