2013-03-11 216 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')