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

时间:2016-03-22 21:04:03

标签: javascript momentjs dst

我们正在追踪我们的应用程序中似乎与moment.js格式化相关的错误。

这是有问题的电话(在Chrome,FF和Edge中转载,供参考):

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

我们的期望:

  

2016年3月13日

我们得到了什么:

  

2016年3月14日

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

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

这是一个简单的JSBIN到demonstrate

这里发生了什么?我们如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

如果您使用默认矩构造函数,则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/

答案 1 :(得分:3)

momentjs documentation regarding parsing with time zones中,他们会显示为了考虑输入字符串中指定的时区,您应该使用moment.parseZone()



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

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js"></script>
&#13;
&#13;
&#13;

以上输出&#34; 2016-03-13&#34;在我的控制台上。

答案 2 :(得分:2)

指定编码时区(-6)但依赖客户端时区进行格式化。差异是罪魁祸首。

答案 3 :(得分:0)

基本上,时刻的格式功能并没有错。 console.log(moment.utc('2016-03-13T23:59:59.999-06:00').toString()); console.log(moment('2016-03-13T23:59:59.999-06:00').toString());

如果你尝试执行上述两行,你会发现moment.utc()基本上取消了偏移并将其转换为UTC时间注意时间,而不仅仅是日期< / em>和moment()将-06:00转换为您当地的时区,如果您的偏移量较小,则由于时间原因,您的日期基本上是错误的。

希望我帮助过。