UTC与ISO时间格式的区别

58

我试图理解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函数有什么作用? - Matt Johnson-Pint
2
如果你想与另一台机器共享日期,可以使用toISOString方法;如果你想以一种特别丑陋、不考虑本地化的方式显示日期给人看,可以使用toUTCString方法。 - Dan
2个回答

131

简短总结

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

UTC和GMT是时间跟踪,不是格式

UTCGMT是两种略微不同的时间跟踪方式。这是一个复杂的话题,如果你真的想知道详细信息,请参阅维基百科页面。

对于常见的业务应用程序,没有显着的区别,实际上少于一秒钟的差异。大多数程序员可以交替使用这些术语。如果你为NASA或GPS / Galileo导航项目工作,则需要了解更多信息。

ISO 8601

在你的第一个示例中看到的格式2019-11-14T00:55:31.820ZISO 8601标准定义。

  • 中间的T将年月日部分与时分秒部分分开。
  • 结尾的Z表示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相差零小时、零分钟和零秒的偏移量。这是当站在格林威治皇家天文台时看到的日期和时间。

enter image description here

(照片来源)

突尼斯墙上挂着的时钟显示的是一个小时后的同时刻:2019-11-14T01:55:31.820+01:00 [非洲/突尼斯]。突尼斯的时区非洲/突尼斯在那一刻比协调世界时提前一个小时,如+01:00所示。

魁北克墙上挂着的时钟显示的是前一天晚上8点差不多的同时刻:2019-11-13T19:55:31.820-05:00[美洲/蒙特利尔]。魁北克的时区美洲/蒙特利尔在那一刻比协调世界时晚五个小时,如-05:00所示。

您可以通过Java代码(而不是标记为您的问题的JavaScript)运行IdeOne.com来查看这些计算。

通常最好在协调世界时中进行大部分思考、业务逻辑、数据存储、数据交换和日志记录。仅在业务规则要求并向用户呈现值时才调整到时区。


非常感谢您的反馈。以第一个示例2019-11-14T00:55:31.820Z为例,我如何知道它属于哪个时区?是指820Z的值吗? - tmp dev
好的,我现在有点困惑了,当你说UTC(偏移量为零)时,这与ISO格式有什么关系? - tmp dev
3
@tmpdev 你明白格式与文本、字符串有关吗?“ISO”和“UTC”不是格式。在2019-11-14T00:55:31.820Z末尾的“Z”表示伦敦格林威治皇家天文台外面的官方时钟指向子午线时刻,也是冰岛所有使用UTC作为时区的时钟所显示的时间。如果没有“Z”,我们就无法知道这个时间是东京日本的凌晨1点、巴黎法国的凌晨1点还是美国俄亥俄托莱多市的凌晨1点——这些时刻相差数小时,非常不同。 - Basil Bourque
谢谢您的澄清,现在更加清晰了。 - tmp dev
1
@Beezer 使用 Z 的惯例源于航空和军事传统,早于 ISO 8601。在这些传统中,Z 确实代表零,该字母在这些传统中被发音为“祖鲁”。请参见 北约音标 - Basil Bourque
显示剩余5条评论

-1
我正在使用 <p-calendar> V.8.2.9 LTS。在 <p-calendar> 中选择的日期以 RFC 的传统格式返回,例如Thu Apr 01 2021 00:00:00 GMT-0400 (Eastern Daylight Time)。我需要将 RFC 转换为 ISO 字符串。

我简单地按照 this threadthis article 所述,使用 JSON.stringify() 包装返回 RFC 格式的变量。

例如:

console.log(date); // Wed Jan 01 2014 13:28:56 GMT-1000 (Hawaiian Standard Time) 
        
var json = JSON.stringify(date);
console.log(json);  // "2014-01-01T23:28:56.782Z"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接