【问题标题】:UTC vs ISO format for timeUTC 与 ISO 时间格式
【发布时间】:2020-03-09 21:15:40
【问题描述】:

我试图了解 UTC 和 ISO 格式之间的区别,以及在服务器之间传输消息时何时使用什么。因此,当我尝试以下操作时,这就是我得到的

new Date().toISOString()
"2019-11-14T00:55:31.820Z"

new Date().toUTCString()
"Thu, 14 Nov 2019 00:55:16 GMT"

我了解 ISO 格式及其用于表示时间的标准,但 UTC 的用途是什么?我将在哪里使用它们?

【问题讨论】:

  • 你问UTC的目的是什么?或者您是在问 JavaScript Date 对象的 toUTCString 函数的目的是什么?
  • 你可以使用 toISOString 与另一台机器共享日期,如果你想要一种特别丑陋、对区域设置不敏感的向人类显示日期的方式,则可以使用 toUTCString。

标签: javascript time utc iso iso8601


【解决方案1】:

tl;博士

  • 始终使用ISO 8601 格式:2019-11-14T00:55:31.820Z
  • 避免使用 RFC 1123 和 822 的传统格式Thu, 14 Nov 2019 00:55:16 GMT

UTC 和 GMT 是计时,不是格式

UTC 和 GMT 不是格式。

UTCGMT 是两种略有不同的时间跟踪方式。这是一个复杂的话题,如果您真的想知道,请参阅 Wikipedia 页面了解详细信息。

对于常见的商业应用,没有显着差异,实际上不到一秒的差异。大多数程序员可以互换使用这些术语。如果您为 NASA 或 GPS/Galileo 导航项目工作,那么您会想了解更多信息。

ISO 8601

在您的第一个示例2019-11-14T00:55:31.820Z 中看到的格式是由ISO 8601 标准定义的。

  • 中间的T 将年-月-日部分与时-分-秒部分分开。
  • 末尾的Z 表示UTC,即零时分秒的UTC 偏移量。根据军事/航空传统,Z 发音为“Zulu”。

ISO 8601 标准更为现代。这些格式经过精心设计,易于机器解析,也易于跨文化的人类阅读。

在将日期时间值序列化为文本时始终选择 ISO 8601

RFC 1123 / RFC 822

您的第二个示例字符串 Thu, 14 Nov 2019 00:55:16 GMT 在旧标准 RFC 1123RFC 822 中定义。

这些是legacy 格式。它们很糟糕,很难被机器解析。而且它们对人类有害,因为它们采用英语和特定的文化规范。

尽可能避免使用这种格式。仅当需要尚未针对 ISO 8601 更新的旧协议和系统时才使用此选项。

时区

您的 2019-11-14T00:55:31.820Z 示例表示与 UTC 的偏移量为零时分秒。这是站在Royal Observatory Greenwich 显示的时钟前看到的时间和日期。

(photo source)

一小时后在突尼斯墙上挂着的时钟上看到的同一时刻:2019-11-14T01:55:31.820+01:00 [非洲/突尼斯]。正如+01:00 所指出的那样,当时突尼斯Africa/Tunis 的时区比UTC 早一小时

与挂在魁北克墙上的时钟上看到的同一时刻显示前一个日期的晚上 8 点:2019-11-13T19:55:31.820-05:00[America/Montreal]。正如-05:00 所指出的那样,此时魁北克America/Montreal 的时区比世界标准时间五个小时。

您可以看到这些计算是使用运行 live at IdeOne.com 的 Java 代码(不是您的问题上标记的 JavaScript)进行的。

通常最好在 UTC 中完成大部分思考、业务逻辑、数据存储、数据交换和日志记录。仅在业务规则需要时以及向用户呈现值时才调整到时区。

【讨论】:

  • 非常感谢您的反馈。以第一个例子2019-11-14T00:55:31.820Z 我怎么知道这属于哪个时区?是820Z 值吗?
  • 正如我的回答中提到的,末尾的 Z 表示 UTC(偏移量为零),发音为“Zulu”。所以不是时区,只是与 UTC 的偏移。时区的名称为Continent/Region,是特定地区人们使用的偏移量的过去、现在和未来变化的历史记录。
  • 好吧,我现在有点困惑,当你说 UTC(零偏移)时,这与 ISO 格式有什么关系?
  • @tmpdev 你明白格式与文本、字符串有关吗? “ISO”和“UTC”不是格式。 2019-11-14T00:55:31.820Z 末尾的Z 表示在本初子午线上盯着伦敦格林威治皇家天文台外的官方时钟时午夜后五十五分钟的时间(也是冰岛所有时钟上看到的时间)它使用 UTC 作为他们的时区)。如果没有Z,我们将不知道这是否意味着日本东京凌晨 1 点、法国巴黎凌晨 1 点或美国俄亥俄州托莱多凌晨 1 点——这是非常不同的时刻,相隔几个小时。
  • @Beezer Z 的使用源自航空和军事领域的传统,早于 ISO 8601。Z 确实代表零,在这些传统中该字母发音为“Zulu” .见NATO phonetic alphabet
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多