【问题标题】:Javascript: Compare current date converted to UTC with date stringJavascript:将转换为 UTC 的当前日期与日期字符串进行比较
【发布时间】:2021-11-17 21:36:19
【问题描述】:

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

【问题讨论】:

    标签: javascript compare utc


    【解决方案1】:

    您似乎处于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 相同。

    【讨论】:

      【解决方案2】:

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

      (new Date(new Date().toISOString().slice(0,-1)) - new Date(measurement.measurementTimestamp))/1000

      【讨论】:

      • 您需要做相反的事情 - 将 Z 添加到另一个时间戳。当您有夏令时界限时,它会有所作为。问题是,显然您的测量时间戳是 UTC,但它没有这么说(它缺少 Z),所以 JS 会将其解释为本地时区。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2019-04-20
      • 2021-04-19
      • 2015-08-06
      相关资源
      最近更新 更多