ISO8601 日期字符串中“Z”之前的值表示什么?

问题描述

我正在努力理解ISO8601 time format

这个值是什么意思?

2019-11-14T00:55:31.820Z

我是这么理解的

2019-11-14 // November 14th,2019 
T00:55:31  // 12:55 AM  in GMT time (London)
.820       // why is this needed or specified?
Z          // The "Z" indicates to store this as GMT time (London)

我不明白为什么这里需要 .820。阅读它,这是指时区 820,即加利福尼亚。

如果我去 Javascript 控制台并在有和没有 820 值的情况下编写此代码,根据我的语言环境(EST 时区),我会得到相同的结果

new Date('2019-11-14T00:55:31.820Z') // Wed Nov 13 2019 19:55:31 GMT-0500 (Eastern Standard Time)
new Date('2019-11-14T00:55:31Z')     // Wed Nov 13 2019 19:55:31 GMT-0500 (Eastern Standard Time)

Z 之前的前缀值实际上是做什么的?

解决方法

“Z”表示将此存储为 GMT 时间(伦敦)

否,它表示显示的时间值 UTC,而不是您应该将其存储在 GMT/UTC 中。它会告诉您在哪个时区解释所提供的信息。

我不明白为什么这里需要 .820。阅读它,这是指时区 820,即加利福尼亚。

那是毫秒,而不是时区。到 00:55:31 有 820 毫秒(例如,距离 00:55:32 有 180 毫秒)。

如果我去 Javascript 控制台并在有和没有 820 值的情况下编写此代码,根据我的语言环境(EST 时区),我会得到相同的结果

只是因为您引用的任何控制台的输出不包括毫秒。如果您检查实际日期,您会发现它们相距 820 毫秒:

const dt1 = new Date('2019-11-14T00:55:31.820Z');
const dt2 = new Date('2019-11-14T00:55:31Z');

console.log(dt1.valueOf() - dt2.valueOf()); // 820

Date 实例的基础值是它自 1970 年 1 月 1 日午夜 UTC 以来所代表的毫秒数。因此,如果我们减去 d2 [它没有 { {1}}] 来自 .820 [确实],我们看到它们相距 820 毫秒。)