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= 相同]
我需要将 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= 相同]