我使用Moment.js在我的web应用程序中解析和格式化日期。作为JSON对象的一部分,我的后端服务器以UTC epoch (Unix偏移量)的毫秒数发送日期。
解析特定时区的日期很简单——只需在解析前将RFC 822时区标识符附加到字符串的末尾:
//响应根据时区不同而不同
Const m1 = moment('3/11/2012 13:00').utc()。格式(“MM / DD HH: MM”)
//问题解决,总是“03/11 17:00”
Const m2 = moment('3/11/2012 13:00 -0400').utc()。格式(“MM / DD HH: MM”)
Console.log ({m1, m2})
< script src = " https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js " > < /脚本>
但是如何在特定时区设置日期格式呢?
无论浏览器的当前时间如何,我都希望结果一致,但我不想以UTC显示日期。
一些答案已经提到了moment-timezone是使用named timezone的方法。我只是想澄清一些让我很困惑的关于这个库的事情。这两种说法有区别:
moment.tz(date, format, timezone)
moment(date, format).tz(timezone)
假设在传入的日期中没有指定时区:
第一个代码接受日期,并假设时区是传入的时区。
第二个函数将使用date,假设浏览器的时区,然后根据传入的时区更改时间和时区。
例子:
moment.tz('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss', 'UTC').format() // "2018-07-17T19:00:00Z"
moment('2018-07-17 19:00:00', 'YYYY-MM-DD HH:mm:ss').tz('UTC').format() // "2018-07-18T00:00:00Z"
我的时区是utc的+5。所以在第一种情况下,它不会改变,它将日期和时间设置为utc时区。
在第二种情况下,它假设传入的日期是-5,然后将其转换为UTC,这就是为什么它吐出日期“2018-07-18T00:00:00Z”
注意:format参数非常重要。如果省略了moment,可能会退回到Date类,从而导致不可预测的行为
假设在传入的日期中指定了时区:
在这种情况下,它们的行为是一样的
尽管现在我明白了为什么它是这样工作的,但我认为这是一个非常令人困惑的功能,值得解释一下。