javascript - 奇怪的行为格式化 moment.js 日期

标签 javascript momentjs dst

我们正在追踪我们应用程序中的一个错误,该错误似乎与 moment.js 格式有关。

下面是有问题的调用(在 Chrome、FF 和 Edge 中转载,供引用):

moment('2016-03-13T23:59:59.999-06:00').format('YYYY-MM-DD')

我们的期望:

2016-03-13

我们得到的:

2016-03-14

这似乎与夏令时有关,因为这是我们能够重现此错误行为并且 DST 在那天翻转的唯一日期(到目前为止)。

如果我们将 UTC 偏移量切换为 -05:00 那么它就可以正常工作。

这是一个简单的 JSBIN 到 demonstrate

这是怎么回事?我们如何解决这个问题?

最佳答案

如果您使用默认的 moment 构造函数,Moment 会将带有偏移量的日期转换为您所在计算机的本地时区。

因此,您的代码按预期工作。日期取自 -6 并转换为您的本地偏移量。

如果要使用指定时区偏移量中的日期,请使用 moment.parseZone:

moment.parseZone('2016-03-13T23:59:59.999-06:00').format()
"2016-03-13T23:59:59-06:00"

如果您想忽略时区偏移量,并在本地时间工作,请指定不包括偏移量的格式。这样做会导致偏移量被忽略。

moment('2016-03-13T23:59:59.999-06:00', 'YYYY-MM-DDTHH:mm:ss.SSS').format()
"2016-03-13T23:59:59-05:00"

请注意,我使用的是 UTC-5,偏移量显示为 -5,因为我忽略了日期中的偏移量。

解析指南可能会有一些帮助: http://momentjs.com/guides/#/parsing/

关于javascript - 奇怪的行为格式化 moment.js 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36165182/

相关文章:

javascript - 当状态由未定义的属性初始化时,如何保护破坏应用程序?

javascript - 如何从 Moment.JS 日期中删除时间?

angular - 如何在 Angular2 中使用 Luxon?

timezone - 使用moment.js将跨越Fall DST边界的一系列非UTC时间戳转换为UTC时间戳的正确方法?

java - 在伦敦获得时间

JavaScript 无法改变 CSS 颜色

javascript - Angular2 - 如何在按键时更改选定的 <select> 元素选项?

java - 将 ZoneId 和时间戳转换为 java 8 中的格式化日期字符串,考虑夏令时

javascript - 将 DOM 元素移动到新窗口并在 IE 11 中维护事件监听器

javascript - 使用 SetInterval() 调用 Javascript 对象方法