【问题标题】:momentjs toDate - different output on different clients/browsersmomentjs toDate - 不同客户端/浏览器上的不同输出
【发布时间】:2019-03-26 17:03:41
【问题描述】:

我使用 momentjs 解析一个日期字符串并将其转换为原生 JavaScript 日期:

let dateString = '1980-04-06';
console.log(moment().utcOffset());
console.log(moment(dateString, 'YYYY-MM-DD').toDate());
<script src="https://cdn.jsdelivr.net/npm/moment@2.22.2/moment.min.js"></script>

客户端 1(Firefox 62) 上的输出是

120
Date 1980 - 04 - 05 T23: 00: 00.000 Z

客户端 2(Firefox 52 ESR)上的输出是

120
Date 1980 - 04 - 05 T22: 00: 00.000 Z

谁能解释一下,为什么 utcOffset 相同(new Date().getTimezoneOffset() 在两个客户端上也打印-120),但日期(小时)不同?

【问题讨论】:

    标签: javascript date timezone momentjs timezone-offset


    【解决方案1】:

    您正在检查 当前 UTC 偏移量,而不是 1980 时刻实例的偏移量。我的猜测是,如果你在 that 上使用 moment(dateString, 'YYYY-MM-DD') 并调用 utcOffset,你会在不同的浏览器上得到不同的偏移量。

    我敢打赌,您所在区域的规则自 1980 年以来发生了变化(例如,可能 DST 的时间发生了变化,或者 DST 已经添加或取消,或者标准偏移量甚至发生了变化)。浏览器获取历史区域数据的正确程度各不相同,这会导致解释日期字符串时出错。我怀疑 Firefox 为您的区域修复了他们的历史区域数据库,导致在新版本的浏览器中出现不同的行为。

    【讨论】:

    • +1 这个也。我同时在写我的答案和细节,但你在这里确实是正确的。 :)
    【解决方案2】:

    您显示的偏移量是针对当前日期和时间的,而不是针对提供的日期的。如果您将中间行更改为记录 moment(dateString, 'YYYY-MM-DD').utcOffset(),您应该会看到旧版 Firefox 52 中的结果是 60 而不是 120

    解释这种差异的因素有:

    • 您所在时区的夏令时规则在 1980 年与今天不同。假设维也纳(根据您的用户资料),1980 年 DST 的开始时间是 4 月 6 日 (reference here) 的 00:00,这是 4 月的第一个星期日。维也纳的当前 (2018) 规则是 3 月的最后一个星期日,即 2018 年 3 月 25 日 (reference here)。

    • ECMAScript 5.1 (section 15.9.1.8) 和更早的版本要求浏览器始终假定当前的 DST 规则一直有效——即使实际上并非如此。这已在 ECMAScript 6 / 2015 (section 20.3.1.8) 中得到纠正。

    • ECMAScript 2015 是在 Firefox 中从 54 版开始实现的。由于您正在测试 52 版,因此您看到的是旧行为。

    • 由于这个特殊的 DST 更改正好在午夜钟声响起,而且它是一个弹簧向前的过渡,因此,1980-04-06T00:00 无效。当天在该时区的第一刻是1980-04-06T01:00。当您传递仅日期值时,Moment 会为您处理此问题。在当前浏览器(62,不是 52)中,如果你现在调用.format(),你应该看到1980-04-06T01:00:00+02:00。请注意,时间已经在 DST 中,具有 UTC+02:00 偏移量。转换为 UTC 为 1980-04-05T23:00:00Z,因此与您的示例中看到的正确数据对齐。

    长话短说,使用最新浏览器的原因有很多。这是其中之一。

    【讨论】:

    • 另外,我可能弄错了,但我认为不再支持 Firefox 52 - 即使是 ESR 版本。
    • 浏览器做调整的时间也有差异。有些似乎在一小时内完成,有些则在几毫秒后完成。
    • 感谢您的详细解释。它对我理解问题的原因有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2013-02-07
    • 1970-01-01
    相关资源
    最近更新 更多