2016-07-14 46 views
1

我的服務將此返回爲日期7/14/2016 2:40 AM +00:00。我如何將它轉換爲JS中的UTC?在JavaScript中對字符串進行日期轉換

嘗試:

new Date("7/14/2016 2:40 AM +00:00").toISOString(); 

在數據庫中的日期已經被存儲爲UTC,所以當我將顯示我想要顯示爲當地時間的日期。

+0

'+00:00'是不是已經在UTC? –

+1

你在想這個...... –

+0

是它的UTC,但想將此日期轉換爲本地。當通過此字符串它投擲的錯誤無效的日期 – aswininayak

回答

0

假設你能保證所有日期該格式,下面的代碼就足夠了:

const datetime = '7/14/2016 2:40 PM +00:00'; // this is what your service returns 
const pieces = datetime.split(/[/: ]/); 

if (pieces[3] == 12) pieces[3] = 0; // fixes edge case for 12 AM/PM 

const hours = pieces[5] === 'PM' ? Number(pieces[3]) + 12 : pieces[3]; 
const d = new Date(Date.UTC(pieces[2], pieces[0] - 1, pieces[1], hours, pieces[4])); 

console.log(datetime); // prints "7/14/2016 2:40 PM +00:00" 
console.log(d); // prints Date 2016-07-14T14:40:00.000Z 

編輯:有一對夫婦的邊緣情況與此不正確處理,即上午12點/ PM等,但這些也可以很容易地解決。

EDIT2:佔用該邊緣案例。

編輯3:正如評論所述,這隻適用於UTC時間。如果您收到的字符串可以有任何偏移量,這將不起作用。

+0

這並不說明任何偏移以外'+00:00'。 –

+0

上午12點/下午幾乎不是「邊緣」案例。在均勻分佈的隨機樣本中,約有8%的時間會出現。 – RobG

+0

如果你真的想爭論我的邊緣案例的定義,去((:我已經編輯了答案來說明它,所以這是有點沒有人在這一點上... – michael

1

解析字符串以產生Date對象的方法很多。

  • 的一種方式是與Date對象本身,無論是通過使一個字符串的構造,或通過使用Date.parse。但是,在ECMAScript規範中只需要ISO8601格式。其他任何輸入都是特定於實現的,可能會或可能不會被不同的JavaScript運行時識別。尤其是使用網絡瀏覽器時,瀏覽器支持的格式有很多不同。

    此外,環境的語言環境在解析值的方式中扮演着重要角色。 1/2/2016應該如何解析? 1月2日或2月1日?您展示了7/14/2016的一個示例,如果在英國運行(例如)日期格式爲DD/MM/YYYY,則這將是無效輸入。

  • 您可以編寫自定義代碼將字符串分割爲多個部分,分別解析每個部分並撰寫結果。這種方法的主要問題是代碼往往僵化,有時易碎。它應該得到很好的測試,並且需要考慮許多邊緣案例。

  • 您可以使用庫,這是迄今爲止最簡單和最靈活的方法(恕我直言)。有了一個好的圖書館,你可以在其他人的共享經驗中以及在你選擇的圖書館(希望是)的單元測試中感到安心。當然,使用庫會帶來一些折衷,包括增加文件大小和放棄某種程度的控制。您應該仔細評估這些權衡。

    有許多日期庫可用於JavaScript。最流行的可能是moment.js,儘管還有其他的可供選擇,而一些較大的框架有時也具有相似的功能。

    下面是使用moment.js一個例子:

    var i = "7/14/2016 2:40 AM +00:00"; 
    var f = "M/D/YYYY h:mm A Z"; 
    var m = moment(i, f); 
    var o = m.format(f); // will be in the local time, in the same format as the input 
    var d = m.toDate(); // if you really want a Date object 
    
0
var str = "7\/15\/2016 1:00 AM +00:00".replace("+00:00","UTC"); 
console.log(new Date(str).toISOString()); // 2016-07-15T01:00:00.000Z 
相關問題