修复 MomentJS 将日期解释为本地时间

问题:

你居住在非 UTC 时区。使用 MomentJS 解析的日期如

moment_parse_example.js
moment("2017-01-01")

被解释为本地时间而不是 UTC(根据 ISO8601 时间戳中的 Z 这将是合适的),因此尝试格式化它们会产生偏移时间戳:

moment_local_time.js
moment("2017-01-01").toDate().toISOString()
// "2016-12-31T23:00:00.000Z" <-- 偏移 1 小时(MEZ - UTC)

这给你带来麻烦,因为原始日期通常不会被保留:在上面的示例中,正确的日期应该是 2017-01-01,但它变成了 2016-12-31

解决方案 1:强制 moment 将日期解析为 UTC

moment_utc_parse.js
moment.utc("2017-01-01").toDate().toISOString()
// "2017-01-01T00:00:00.000Z" <-- 正确

解决方案 2:手动减去时区偏移

moment_subtract_offset.js
let m = moment("2017-01-01");
// 减去时区和 UTC 之间的差异
m = m.subtract(m.toDate().getTimezoneOffset(), 'minutes');
// m.toDate().toISOString() === "2017-01-01T01:00:00.000Z" - 正确

如果解决方案 1 不起作用或你无法修改解析代码,请使用此方法:即使日期已被解析,此解决方案也有效。

不要使用

moment_wrong_offset.js
new Date().getTimezoneOffset() // 永远不要使用这个!可能使用错误的偏移!

因为它使用当前日期的时区偏移而不是 MomentJS 解析的日期的偏移。显然这在有夏令时的国家是错误的,因为日期可能有不同的偏移取决于日期。此外,在极少数情况下,客户端计算机时区可能由于旅行等在此期间发生了变化,因此可能不代表要使用的正确偏移。


Check out similar posts by category: Javascript