Moment.js:在特定时区中格式化日期

时间:2013-03-11 20:05:52

标签: javascript timezone momentjs

我使用Moment.js来解析和格式化我的网络应用中的日期。作为JSON对象的一部分,我的后端服务器将日期作为UTC纪元(Unix偏移)的毫秒数发送。

在特定时区解析日期很容易 - 只需在解析之前将RFC 822时区标识符附加到字符串的末尾:

// 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格式显示日期。

8 个答案:

答案 0 :(得分:194)

正如Manto's answer所指出,.utcOffset()是时刻2.9.0的首选方法。此函数使用UTC的实际偏移量,而不是反向偏移量(例如,DST期间纽约的-240)。像“+0400”这样的偏移字符串与以前一样工作:

// 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')

Moment.js 2.9.0中较旧的.zone() as a setter 已弃用。它接受包含时区标识符的字符串(例如,“-0400”或“-04:00”-4小时)或代表背后 UTC的数字的数字(例如,在DST期间为纽约的240) )。

// 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并使用.tz()代替:

// 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 :(得分:40)

使用moment-timezone

moment(date).tz('Europe/Berlin').format(format)

在能够访问特定时区之前,您需要像这样加载它(或使用描述here所述的替代方法)

moment.tz.add('Europe/Berlin|CET CEST CEMT|-10 -20 -30')

答案 2 :(得分:21)

已经有几个答案提到了使用即时时区和命名时区。我只想澄清一下这个库,这让我很困惑。这两个语句之间是有区别的:

<script src="https://unpkg.com/vue@2.5.16"></script>
<div id="app">
  <color-block v-for="hex in colors" :hexcolor="hex.hex">
  </color-block>
</div>

假定在传入的日期中未指定时区:

第一个代码输入日期,并假定时区是传入的时区。 第二个将带日期,从浏览器中获取时区,然后根据传入的时区更改时间和时区。

示例:

moment.tz(date, format, timezone)

moment(date, format).tz(timezone)

我的时区是utc的+5。因此,在第一种情况下,它不会更改,而是将日期和时间设置为具有utc时区。

在第二种情况下,它假定传入的日期为-5,然后将其转换为UTC,这就是为什么它将日期显示为“ 2018-07-18T00:00:00Z”

注意:format参数确实很重要。如果省略,则可能会回到Date类,这可能导致无法预测的行为


假定在传递的日期中指定了时区:

在这种情况下,它们的行为均相同


即使现在我明白了为什么这样做了,我还是认为这是一个非常令人困惑的功能,值得解释。

答案 3 :(得分:16)

.zone()已被弃用,您应该使用utcOffset:

// for a timezone that is +7 UTC hours
moment(1369266934311).utcOffset(420).format('YYYY-MM-DD HH:mm')

答案 4 :(得分:3)

我和Moment.js有同样的问题。我已安装了时刻 - 时区,但问题尚未解决。然后,我做了它暴露的内容,设置了时区,它就像一个魅力:

moment(new Date({your_date})).zone("+08:00")

非常感谢!

答案 5 :(得分:3)

刚刚来到这里,因为我有同样的问题,我只是发布我想出的结果

解析时,你可以更新偏移量(即我正在解析数据(1.1.2014)而我只想要日期,2014年1月1日。在GMT + 1上我得到31.12.2013。所以我首先抵消该值。

moment(moment.utc('1.1.2014').format());

嗯,派而上我支持跨时区

答案 6 :(得分:-1)

如果您将时间戳作为参数传递给 moment()(例如,如果时区是 Asia/Hong_kong,即 +08:00),我要做的是:

const localDateTime = moment((item.createdAt.seconds + 8 * 3600) * 1000).format('YYYY-MM-DD HH:mm:ss');

答案 7 :(得分:-2)

您可以尝试一下,

在这里您可以根据客户端时区(浏览器)获取日期。

moment(new Date().getTime()).zone(new Date().toString().match(/([-\+][0-9]+)\s/)[1]).format('YYYY-MM-DD HH:mm:ss')

regex基本上可以获取偏移值。

干杯!