Format date in a specific timezone
我正在使用Moment.js来解析和格式化我的网络应用程序中的日期。 作为JSON对象的一部分,我的后端服务器将日期作为UTC纪元(Unix偏移)的毫秒数发送。
在特定时区解析日期很简单 - 只需在解析之前将RFC 822时区标识符附加到字符串的末尾:
1 2 3 4 5 | // response varies according to your timezone moment('3/11/2012 13:00').utc().format("MM/DD HH:mm") // problem solved, always"03/11 17:00" moment('3/11/2012 13:00 -0400').utc().format("MM/DD HH:mm") |
但是如何在特定时区格式化日期?
无论浏览器的当前时间如何,我都希望得到一致的结果,但我不希望以UTC显示日期。
正如Manto的回答所指出的那样,
1 2 3 | // always"2013-05-23 00:55" moment(1369266934311).utcOffset(60).format('YYYY-MM-DD HH:mm') moment(1369266934311).utcOffset('+0100').format('YYYY-MM-DD HH:mm') |
作为setter的旧
1 2 3 | // always"2013-05-23 00:55" moment(1369266934311).zone(-60).format('YYYY-MM-DD HH:mm') moment(1369266934311).zone('+0100').format('YYYY-MM-DD HH:mm') |
要使用命名时区而不是数字偏移,请包含Moment Timezone并使用
1 2 3 | // determines the correct offset for America/Phoenix at the given moment // always"2013-05-22 16:55" moment(1369266934311).tz('America/Phoenix').format('YYYY-MM-DD HH:mm') |
使用时刻时区
1 | moment(date).tz('Europe/Berlin').format(format) |
在能够访问特定时区之前,您需要像这样加载它(或使用此处描述的替代方法)
1 | moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30') |
几个答案已经提到,时刻时区是指定时区的方式。我只是想澄清一下这个库让我很困惑。这两个陈述有所不同:
1 2 3 | moment.tz(date, format, timezone) moment(date, format).tz(timezone) |
假设在传入的日期中未指定时区:
第一个代码接受日期并假定时区是传入的时区。
第二个将采用日期,从浏览器中假设时区,然后根据传入的时区更改时间和时区。
例:
1 2 3 | 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"
注意:格式参数非常重要。如果省略,则可能会回退到可能无法预测的行为的Date类
假设在传入的日期中指定了时区:
在这种情况下,他们都表现得一样
即使现在我理解为什么它以这种方式工作,我认为这是一个非常令人困惑的功能,值得解释。
.zone()已被弃用,您应该使用utcOffset代替:
1 2 | // for a timezone that is +7 UTC hours moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm') |
我和Moment.js有同样的问题。我安装了时刻 - 时区,但问题没有解决。然后,我做了它暴露的东西,设置时区,它就像一个魅力:
1 | moment(new Date({your_date})).zone("+08:00") |
非常感谢!
刚刚来到这里,因为我遇到了同样的问题,我只想发布我想出的结果
解析时,你可以更新偏移量(即我正在解析数据(1.1.2014),我只想要日期,2014年1月1日。在GMT + 1上我得到31.12.2013。所以我首先抵消了这个值。
1 | moment(moment.utc('1.1.2014').format()); |
好吧,派上用场支持我跨越时区
乙
你可以尝试这个,
在这里,您可以根据客户端时区(浏览器)获取日期。
1 | moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss') |
正则表达式基本上可以获得偏移值。
干杯!!