2013-03-11 36 views
87

我正在使用Moment.js在我的Web应用程序中解析和格式化日期。作为JSON对象的一部分,我的后端服务器将日期从UTC纪元(Unix偏移量)发送为毫秒数。Moment.js:在特定时区中格式化日期

分析日期在特定的时区很容易 - 只需追加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") 

但我怎么在specifc格式化日期时区?无论浏览器的当前时间如何,我都希望获得一致的结果,但我不希望以UTC显示日期。

+2

Moment不支持这个,但他们正在处理它。 https://github.com/timrwood/moment/pull/671 – Ben 2013-03-11 20:11:53

+4

这应该只是工作。如果你传递包含所需偏移量的时间字符串,那么它应该保留该偏移量并显示给定的本地时间,而不是自动调整到浏览器本地时间。如果我希望它适应浏览器本地时间,那么我会给它一个UTC时间,而不是明确给它一个使用的偏移量。我的意思是......我给它一个明确的偏移量,为什么它基本上把它吃掉,并且自己将它转换为浏览器偏移量。可怕的设计。 – Triynko 2015-08-11 15:26:36

+0

@Triynko偏移量受到夏令时的限制,因此它并不总是按预期工作。 – pinkpanther 2016-08-16 15:25:30

回答

132

正如在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弃用。它接受包含时区标识符(例如-4小时的“-0400”或“-04:00”)的字符串或代表 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') 
+0

我通过“TypeError:Object 240 has no method'format'”错误遇到了问题。我意识到zone只能在2.1.0版本以上的Moment.js中使用(我使用的是旧版本)。谢谢! – 2013-10-10 23:05:12

+0

您也可以通过“美国/菲尼克斯”时区。 – 2013-11-05 02:03:12

+0

有没有办法使用用户的浏览器时区? – ebi 2013-11-25 07:23:18

4

我是有Moment.js同样的问题。我已经安装了瞬间时区,但问题没有解决。然后,我只是在这里做了什么,设置时区,它的作用就像一个魅力:

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

非常感谢!

+9

你不应该使用'new Date()'构造函数。 Moment提供了解析日期所需的一切。请参阅[解析](http://momentjs.com/docs/#/parsing/)文档。 – user113215 2014-09-17 21:03:31

+0

是的,但如果我不这样做,我收到来自Moment的警告,它不赞成类似的东西 – facundofarias 2014-09-18 09:46:42

+4

警告意味着Moment正在内部回落到你正在做的(使用'new Date( )'内部),但这是[不同浏览器](http://dygraphs.com/date-formats.html)。相反,您应该使用提供期望的格式作为第二个参数。例如:'时刻(“12-25-1995”,“MM-DD-YYYY”)。 – user113215 2014-09-18 13:52:22

23

使用moment-timezone

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

,然后才能访问特定的时区,你将需要加载它,像这样(或使用替代方法描述here

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

我不认为问题提出时tz可用,但我确实认为这可能是要走的路。我目前正在处理一个与MySQL中存储为UTC的所有时间戳类似的问题,但要根据用户配置而不是客户端的时区在特定区域中查看。 – nickdnk 2015-08-18 11:32:49

2

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

解析时,你可以更新偏移量(即我解析数据(1.1.2014),我只想要日期,2014年1月1日。在格林尼治标准时间+ 1我会得到31.12.2013。所以我先抵消了价值。

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

好,派上了用场,我跨时区

9

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

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