【发布时间】:2021-11-17 21:36:19
【问题描述】:
【问题讨论】:
标签: javascript compare utc
【问题讨论】:
标签: javascript compare utc
您似乎处于Europe/Berlin 或类似时区,目前与 UTC 有 2 小时的正偏移。
ISO 格式的时间戳应指定时区作为后缀。 Z 将是 UTC。但是,您的 measurementTimestamp 缺少后缀,new Date 将其解释为“当前本地时区”(在您的情况下为 +02:00),这就是您在这里得到差异的原因。
您可以将缺少的Z 添加到measurementTimestamp 以解决此问题:
(new Date('2021-09-24T15:38:18.569Z') - new Date('2021-09-24T15:37:46.612Z')) / 1000
// ^
// Result: 31.957
重要提示:这与从另一个时间戳中删除 Z 不同,因为那样您实际上会在本地时区比较两次(实际上是时间这与您真正关心的任何事情都无关,因为它们是将 UTC 时间解释为当地时间的结果,然后指向不同的时间点)。
您可能认为这无关紧要,因为如果 两者 现在它们都是本地的,那么偏移量应该会抵消,对吧? ...但如果您比较的时间戳之间存在 夏令时边界,则情况并非如此!如果两者都是 UTC,它们是绝对的(UTC 中没有夏令时 - 它会在 Europe/London 但不一样),但在您当地的时区,您可以让时钟来回移动一年两次(Europe/Berlin 半年为 +02:00,其余时间为 +01:00)。
查看我得到的这些结果(我在Europe/Berlin):
(new Date('2021-03-28T03:00:00Z') - new Date('2021-03-28T01:00:00Z')) / 1000
// Result: 7200
(new Date('2021-03-28T03:00:00') - new Date('2021-03-28T01:00:00')) / 1000
// Result: 3600 (!!!)
这里的时钟从 2021 年 3 月 28 日的 02:00 提前到 03:00。因此,将 03:00 和 01:00 这两个时间与 本地时区 进行比较,我只能得到 一个小时 的差异,而不是两个!如果我现在真的打算将 03:00 UTC 与 01:00 UTC 进行比较,我会得到一个完全错误的结果,这可能会毁了我的一天。
让我再添加一个更糟糕的例子:
(new Date('2021-03-28T03:30:00Z') - new Date('2021-03-28T02:45:00Z')) / 1000
// Result: 2700
(new Date('2021-03-28T03:30:00') - new Date('2021-03-28T02:45:00')) / 1000
// Result: -900 (???)
03:30 应该是 45 分钟(2700 秒)在 02:45 之后,对吧?那么为什么我们现在得到一个 负 数字 -15 分钟?好吧,在我的当地时间,02:45 甚至不存在,因为在 01:59 之后到了当天的 03:00... 它的处理方式与您尝试设置JavaScript 中的 11 月 31 日之类的日期(将像 12 月 1 日一样处理) - 它会翻转并被视为与 03:45 相同。
【讨论】:
好的,大概明白了:我需要从 toISOString 格式中删除 Z 字符。它有效,但我不确定它是否正确。
(new Date(new Date().toISOString().slice(0,-1)) - new Date(measurement.measurementTimestamp))/1000
【讨论】:
Z 添加到另一个时间戳。当您有夏令时界限时,它会有所作为。问题是,显然您的测量时间戳是 UTC,但它没有这么说(它缺少 Z),所以 JS 会将其解释为本地时区。