首页 文章

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

提问于
浏览
124

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

解析日期 in a specific timezone 很简单 - 只需在解析之前将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")

但是如何格式化日期 in a specifc timezone ?我想要一致的结果,无论浏览器's current time, but I don'吨想要以UTC格式显示日期 .

7 回答

  • 187

    正如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')
    

    年龄.zone() as a setter在Moment.js 2.9.0中是 deprecated . 它接受包含时区标识符的字符串(例如,_4403092_或"-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')
    
  • -2

    使用moment-timezone

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

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

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

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

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

    几个答案已经提到,时刻时区是指定时区的方式 . 我只是想澄清一下这个库让我很困惑 . 这两个陈述有所不同:

    moment.tz(date, format, timezone)
    
    moment(date, format).tz(timezone)
    

    Assuming that a timezone is not specified in the date passed in:

    第一个代码接受日期并假设时区是传入的时区 . 第二个代码将采用日期,从浏览器中假设时区,然后根据传入的时区更改时间和时区 .

    例:

    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”

    NOTE: The format parameter is really important. If omitted moment might fall back to the Date class which can unpredictable behaviors


    Assuming the timezone is specified in the date passed in:

    在这种情况下,他们都表现得一样


    即使现在我理解为什么它以这种方式工作,我认为这是一个非常令人困惑的功能,值得解释 .

  • 3

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

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

    非常感谢!

  • 11

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

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

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

    好吧,派上用场支持我跨越时区

  • 15

    你可以尝试这个,

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

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

    正则表达式基本上可以获得偏移值 .

    干杯!!

相关问题