奇怪的行为格式化 moment.js 日期
Strange behavior formatting moment.js date
我们正在追踪我们应用程序中的一个错误,该错误似乎与 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
这是怎么回事?我们如何解决这个问题?
您正在指定编码时区 (-6),但格式设置依赖于客户端时区。差异是罪魁祸首。
时刻的格式化功能基本上没有问题。
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 时间 注意时间,而不仅仅是date 和 moment()
将 -06:00 偏移量转换为您当地的时区,如果您的偏移量较小,您基本上会得到错误的日期,因为时间。
希望我有所帮助。
在 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>
上面的控制台为我输出“2016-03-13”。
如果您使用默认的 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/
我们正在追踪我们应用程序中的一个错误,该错误似乎与 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
这是怎么回事?我们如何解决这个问题?
您正在指定编码时区 (-6),但格式设置依赖于客户端时区。差异是罪魁祸首。
时刻的格式化功能基本上没有问题。
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 时间 注意时间,而不仅仅是date 和 moment()
将 -06:00 偏移量转换为您当地的时区,如果您的偏移量较小,您基本上会得到错误的日期,因为时间。
希望我有所帮助。
在 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>
上面的控制台为我输出“2016-03-13”。
如果您使用默认的 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/