平台们都在做些什么来支持在类似于 ISO 8601 的字符串中识别时区?我注意到最新的 Java 日期/时间库正在使用扩展的 ISO 8601 格式来表示,例如
2011-12-03T10:15:30+01:00[Europe/Paris]
。(请参见DateTimeFormatter API。)是否有一些汇合的约定(例如与其他语言和平台),以扩展 ISO 8601 来支持时区指定?
2011-12-03T10:15:30+01:00[Europe/Paris]
。(请参见DateTimeFormatter API。)现在有一份IETF草案提议扩展RFC3339。其中包括在方括号内添加时区标识符等内容:https://datatracker.ietf.org/doc/draft-ietf-sedate-datetime-extended/
我了解这些不被ISO 8601支持,是吗?
正确。ISO-8601不涉及时区标识符。IANA/Olson TZ名称并非“标准”,而只是我们最可靠的东西。(有人可能认为它们是事实上的标准。)
平台正在做些什么来支持这个吗?
支持什么?你问题的这部分不清楚。如果你是指支持IANA时区,那就随处可见。有些平台内置它们,有些依赖库。如果你是指支持ISO-8601日期时间偏移量+时区ID的字符串表示形式,则某些平台具有此功能,而某些平台则没有。如果想了解更多信息,您需要更具体。
我注意到最新的Java日期/时间库使用了扩展的ISO 8601格式,例如2011-12-03T10:15:30+01:00[Europe/Paris]。(请参阅DateTimeFormatter API。)
我认为你在谈论DateTimeFormatter.ISO_ZONED_DATE_TIME
。文档明确指出:
类似ISO的日期时间格式...
...将ISO-8601扩展偏移日期时间格式添加到时区。方括号中的部分不是ISO-8601标准的一部分。
因此,这是Java的特定格式,不是一项标准。
是否有某种收敛约定(例如与其他语言和平台)来扩展ISO 8601以支持时区指定?
据我所知,目前没有涵盖将ISO8601时间戳和IANA时区标识符组合成单个格式的标准。可以用许多不同的方式表示它,包括:
2011-12-03T10:15:30+01:00[Europe/Paris]
(这是Java 8的默认值)2011-12-03T10:15:30+01:00(Europe/Paris)
2011-12-03T10:15:30+01:00 Europe/Paris
2011-12-03T10:15:30+01:00 - Europe/Paris
2011-12-03T10:15:30+01:00/Europe/Paris
2011-12-03T10:15:30+01:00|Europe/Paris
2011-12-03T10:15:30 Europe/Paris (+01)
(这是Noda Time的默认值)如果您要在API中以标准化的方式包含ZonedDateTime
或类似数据,我个人建议将时区名称作为单独的字段传递。这样,每个数据部分都尽可能好。例如,在JSON中:
{
"timestamp": "2011-12-03T10:15:30+01:00",
"timezone": "Europe/Paris"
}
马特·约翰逊的回答是非常正确的。我想再补充一些想法。
UTC偏移量只是一个小时、分钟和秒数,表示比UTC快或慢多少时间。单独使用它不能准确地确定日期时间。因此,同时包含官方时区名称更为详细。
虽然目前还没有标准要求包含时区名称,但我希望其他人能够效仿java.time类,在方括号中添加时区名称。这种格式对我来说很合理,因为可以简单地截取方括号部分以向后兼容不精通软件。
例如:2011-12-03T10:15:30+01:00[欧洲/巴黎]
。如果数据只有2011-12-03T10:15:30+01:00
,我们可以确定时间轴上的时刻,但无法将其他时刻调整到相同的帧中,因为我们不知道要应用哪些调整规则。诸如欧洲/萨格勒布
、非洲/布拉柴维尔
、北极/朗伊尔城
和欧洲/马恩岛
等区域都共享+01:00
的偏移量,但它们可能会有其他不同于欧洲/巴黎
的调整。因此,如果你尝试将三天添加到值2011-12-03T10:15:30+01:00
中,你实际上无法准确计算结果,因为你不知道在这三天内可能发生的DST换季等需要应用的调整。America/Los_Angeles
的一部分今年比UTC晚8小时,而该年的另一部分将比UTC晚7小时。这使得作为该时区的一部分收集了2个数据点。Europe/Istanbul
中有多个数据点。
个人认为,即使使用诸如2011-12-03T10:15:30+01:00
这样的值也没有太多价值。如果没有时区,您可以只使用UTC。在这种情况下,2011-12-03T09:15:30Z
(上午9点而不是上午10点)。
通常,存储和交换日期时间值时最好使用UTC。将UTC视为唯一真实的时间,带区域或偏移值仅是变体。