当前位置: 首页 > 知识库问答 >
问题:

在 ISO 8601 中识别时区

楮景明
2023-03-14

不,我说的不是时区偏移,而是根据夏令时等因素,一个地区的时区偏移在一年中可能会有所不同。我说的是IANA保持的实际时区。我知道ISO 8601不支持这些,对吗?

平台正在采取哪些措施来支持在类似 ISO 8601 的字符串表示中标识时区?我注意到最新的Java日期/时间库为此使用了扩展的ISO 8601格式,例如2011-12-03T10:15:30 01:00[欧洲/巴黎]。(请参见日期时间格式化程序 API。

是否有一些融合的约定(例如与其他语言和平台)来扩展ISO 8601以支持时区指定?

共有2个答案

麹凯捷
2023-03-14

马特·约翰逊的回答非常正确。我只想补充一些想法。

与UTC的时差只是比UTC早/晚几个小时、几分钟和几秒钟。单独来看,这确实使日期时间成为时间线上的一个特定时刻。但是它的信息量远不如包含官方时区名称的信息量大。

虽然还没有包含时区名称的标准,但我希望其他人也能效仿java。中的时间类,在方括号中附加时区名称。对我来说,这种格式似乎是合理的,因为截断方括号部分可以很简单地向后兼容非智能软件。

例如:
2011-12-03T10:15:30 01:00[Europe/Paris]。如果数据仅为2011-12-03T10:15:30 01:00,我们将能够识别时间线上的时刻,但无法将其他时刻调整到相同的思维框架中,因为我们不知道应用什么调整规则。欧洲/萨格勒布、非洲/布拉柴维尔、北极/朗伊尔边和欧洲/Isle_of_Man等区域都共享01:00的偏移量,但它们很可能有与欧洲/巴黎不同的其他有效调整。因此,如果您尝试将三天添加到值2011-12-03T10:15:30 01:00,您确实无法忠实地计算结果,因为您不知道可能需要应用哪些调整,例如在这三天内可能发生的DST切换。

时区定义用于处理异常(如夏令时 (DST))的一组规则。世界各地的政治家都喜欢调整他们的时区,甚至重新定义它们。因此,这些规则经常变化。将时区视为随时间变化的偏移量的集合,即历史上的许多时间段,其中每个时间段在该特定区域中使用的特定偏移量。

您可以将时区视为与 UTC 值的偏移量的集合。在美国/Los_Angeles今年部分时间比 UTC 晚 8 个小时,一年中的一部分时间将比 UTC 晚 7 个小时。这使得收集的2个数据点作为该时区的一部分。

另一个例子是,在前几年,土耳其每年的一部分时间比UTC提前2小时,一部分时间提前3小时。2016年,这变成了无限期提前3小时。因此,时区中的多个数据点<code>欧洲/伊斯坦布尔<code>。

就我个人而言,即使使用像< code > 2011-12-03t 10:15:30 01:00 这样的值,我也看不出有什么价值。如果没有时区,你也可以只使用UTC。在这种情况下,< code > 2011-12-03t 09:15:30Z (上午9点而不是上午10点)。

一般来说,最佳实践是在存储和交换日期时间值时使用UTC。将UTC视为一个真实时间,分区或偏移值只是变化。

缪阎宝
2023-03-14

现在有一个IETF提案草案,以方括号中的时区标识符扩展RFC3339,其中包括:https://datatracker.ietf.org/doc/draft-ietf-sedate-datetime-extended/

我知道ISO 8601不支持这些,对吗?

正确。ISO-8601与时区标识符无关。IANA/奥尔森·TZ的名字并不是一个“标准”。它们只是我们拥有的最可靠的东西。(有些人可能认为它们是事实上的标准。)

平台正在做些什么来支持这一点?

支持什么?你这部分问题不清楚。如果你想支持IANA时区,那么到处都是。有些平台内置了它们,有些则依赖于库。如果您想支持ISO-8601日期-时间-时差时区ID的字符串表示,有些平台有,有些没有。如果你想知道更多,你必须说得更具体些。

我注意到最新的Java日期/时间库为此使用了扩展的ISO 8601格式,例如2011-12-03T10:15:30 01:00[欧洲/巴黎]。(请参见日期时间格式化程序 API。

我想你说的是< code>DateTimeFormatter。ISO_ZONED_DATE_TIME。医生明确说:

类似 ISO 的日期时间格式化程序...

...扩展ISO-8601扩展偏移日期时间格式以添加时区。方括号中的部分不是ISO-8601标准的一部分。

所以这是Java的具体格式,不是标准。

是否有一些融合的约定(例如与其他语言和平台)来扩展ISO 8601以支持时区指定?

据我所知,目前还没有标准涵盖将IANA时区标识符和ISO8601时间戳合并成一种格式。人们可以用许多不同的方式来表示它,包括:

  • 2011-12-03T10:15:30 01:00[欧洲/巴黎](这是Java 8中的默认设置)
  • 2011-12-03T10:15:30 01:00(欧洲/巴黎)
  • 2011-12-03T10:15:30 01:00欧洲/巴黎
  • 2011-12-03T10:15:30 01:00-欧洲/巴黎
  • 2011-12-03T10:15:30 01:00/欧洲/巴黎
  • 2011-12-03T10:15:30 01:00 |欧洲/巴黎
  • 2011-12-03T10:15:30欧洲/巴黎(01)(这是野田时间的默认值)

如果您正在寻找一种以标准化方式在API中包含ZonedDateTime或类似数据的方法,我个人的建议是在单独的字段中传递时区名称。这样,数据的每一部分都尽可能好。例如在JSON中:

json prettyprint-override">{
  "timestamp": "2011-12-03T10:15:30+01:00",
  "timezone": "Europe/Paris"
}
 类似资料:
  • 我有这样一个时间戳:

  • 问题内容: 我需要做什么 我有一个不了解时区的datetime对象,我需要向其添加一个时区,以便能够将其与其他时区感知的datetime对象进行比较。对于这一旧情况,我不想将我的整个应用程序转换为时区。 我尝试过的 首先,演示问题: 首先,我尝试了astimezone: 这次失败并不令人惊讶,因为它实际上是在尝试进行转换。替换似乎是一个更好的选择(根据Python:如何获取“时区感知”的datet

  • 我已经完成了npm安装netlify-cli-g,这是成功安装。我得到以下回应: 已弃用的core-js@2.6.11:core-js@ netlify-cli@2.36.0安装后C:\Users\soyebp\AppData\Roaming\npm\node\u modules\netlify cli节点/脚本/后安装。js 成功!Netlify CLI已安装! 您的设备现在配置为使用Netli

  • 我知道这是一个非常常见的问题,但我觉得我找到的答案并没有真正解决问题。我将概述我的具体用例,并对来自其他SO答案和网络的信息进行总结。 对于我正在编写的服务,数据库条目被创建并存储在移动设备和我们的网站上,需要以两种方式同步。我们目前的目标是Android和iOS,它们都使用sqlite作为关系数据库。服务器端是使用Django和MySQL在Python中实现的,但将来可能会有其他解决方案取代它。

  • 问题内容: 我是ElasticSearch和Kibana的新手,无法让Kibana识别我的时间戳。 我有一个JSON文件,其中有很多数据,我希望使用Curl插入Elasticsearch中。这是JSON条目之一的示例。 我试图使用以下命令在Elasticsearch中创建索引: 然后,我尝试为时间戳设置适当的映射: //时间戳记格式,网址为http://www.elasticsearch.org/