Javascript: 将当前日期转换为 UTC 与日期字符串进行比较

Javascript: Compare current date converted to UTC with date string

我需要将 UTC 字符串格式的传入日期与 javascript 中的当前日期进行比较。但是,如果我尝试任何方法,我仍然会得到 2 小时的差异。

好的,大概明白了:我需要从 toISOString 格式中删除 Z 字符。它有效,但我不确定它的方法是否正确。

(新日期(新日期().toISOString().slice(0,-1)) - 新日期(measurement.measurementTimestamp))/1000

您似乎处于 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 秒)after 02:45,对吧?那我们现在怎么得到一个 -15 分钟的 negative 数字?好吧,在我的本地时间,02:45 甚至不存在 因为那天 01:59 之后 03:00...就像您尝试在 JavaScript 中设置像 11 月 31 日这样的日期(这将像 12 月 1 日一样处理) - 它滚动并被视为与 03:45.[=23= 相同]