2016-07-15 69 views
0

我有一個時區的ISO時間戳:如何在Javascript中給定時區格式化日期?

> let datestring = "2016-07-15T09:20:32.730689-04:00"; 

我想同時保持時區將其格式化爲人類可讀的格式,如「2016年7月15日,09:20」。

我想這第一:

> new Date(datestring).toString() 
"Fri Jul 15 2016 15:20:32 GMT+0200 (CEST)" 
> new Date(datestring).toISOString() 
"2016-07-15T13:20:32.730Z" 

當然,這不能做什麼,我想是因爲紀元以來new Date()只存儲毫秒,-04:00時區進行解析後回落。好的。

我還了解到:使用

  • toString()格式W/R/T我的本地時區,類似於asctime格式,
  • toISOString()格式W的從ISO格式/ R/T UTC 8601.

兩者看起來都很有幫助,所以我們來看看庫。


我想接下來的事情是moment

> moment(datestring)._tzm 
-240 

沒關係,時刻不會失去我的約會的時區!這很好,我希望我可以在Python中使用像datetime對象那樣的moment對象。那麼我如何格式化它?

> moment(datestring).toString() 
"Fri Jul 15 2016 15:20:32 GMT+0200" 
> moment(datestring).toISOString() 
"2016-07-15T13:20:32.730Z" 

哦,這些看起來像Moment剛剛轉發請求到日期時間。讓我們嘗試一下然後:

moment(datestring).format("MMM D YYYY, HH:mm") 
"Jul 15 2016, 15:20" 

格式看起來不錯,但這是什麼15:20?哦,那是我當地的時間。看起來像format()也假定我想忽略日期時間的解析時區偏移量,我更喜歡我的本地時區。這裏沒有運氣。

但有moment().utcOffset,讓我來指定一個給定的時區偏移:

> let m = moment(datestring) 
> m.utcOffset(m._tzm).format("MMM D YYYY, HH:mm") 
"Jul 15 2016, 09:20" 

耶,它的作品!不過,我沒有看到這_tzm任何地方記錄,看起來我現在正在搞moment內部。


什麼是「通過這本書」的方式來實現這一目標?

這可以在沒有moment的香草js中完成,假設我對iso格式很好嗎?

+0

在香草js中很難做到這一點。你見過[時刻時區](http://momentjs.com/timezone/)嗎?這可能會有所幫助。 –

+0

當我希望能夠說「在美國/東部顯示這個日期」時,我通常使用'moment-timezone'。這是一個不同的情況:我已經有了所需時區偏移的時間戳。 – Kos

回答

1

我認爲你正在尋找parseZone功能:

let datestring = "2016-07-15T09:20:32.730689-04:00"; 
let m = moment.parseZone(datestring); 

m.hour();      // 9 
m.format("MMM D YYYY, HH:mm"); // "Jul 15 2016, 09:20" 

默認情況下,瞬間將使用本地時區,但如果你使用parseZone那麼它將使用輸入字符串的時區。