我们正在追踪我们的应用程序中似乎与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
这里发生了什么?我们如何解决这个问题?
答案 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;
以上输出&#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转换为您当地的时区,如果您的偏移量较小,则由于时间原因,您的日期基本上是错误的。
希望我帮助过。