2016-07-14 67 views
2

我有一個輸入字段,用戶需要選擇日期/時間 根據一年中的時間,本地機器將始終處於GMT或BST狀態。moment.js轉換沒有效果

對於那些誰不知道英國時間的惡作劇:

GMT(格林威治標準時間)始終爲UTC

BST(英國夏令時)爲GMT + 1在夏季

用戶輸入的日期將存儲在設置爲GMT的數據庫中,因此永遠不會偏移時間。因此我需要將用戶輸入的內容轉換爲GMT/UTC。

但是,我的轉換導致返回相同的日期。

我在做什麼錯?

https://jsfiddle.net/r68owagL/

下面是從的jsfiddle

function log(obj) { 
    var html = "<table>" 
    for(var member in obj) 
    { 
     html += "<tr>" 
       + "<td>" + member + ": </td>" 
       + "<td>" + obj[member].format("YYYY-MM-DD HH:mm:ss") + "</td>" 
       + "</tr>"; 
    } 
    html += "</table>"; 
    document.body.innerHTML = html; 
} 

var strDate = '2016-07-14 10:51:00'; 
var obj = { 
    n: moment(strDate),     //Gives: 2016-07-14 10:51:00 
    u: moment.utc(strDate),    //Gives: 2016-07-14 10:51:00 
    b: moment.tz(strDate, "Europe/London") //Gives: 2016-07-14 10:51:00 
} 

log(obj); 

回答

2

代碼如果您刪除格式的字符串,然後輸出日期,像這樣

obj[member].format() 

那麼像這樣

輸出
n: 2016-07-14T10:51:00+02:00 
u: 2016-07-14T10:51:00+00:00 
b: 2016-07-14T10:51:00+01:00 

因此,自定義格式字符串只輸出日期而不考慮偏移量。要考慮到這些,將它打印出來,像這樣

obj[member].utc().format("YYYY-MM-DD HH:mm:ss") 

導致

n: 2016-07-14 08:51:00 
u: 2016-07-14 10:51:00 
b: 2016-07-14 09:51:00 
+0

關閉足以讓我正確的我的代碼之前轉換爲UTC:https://jsfiddle.net/ r68owagL/1 /,因此將其標記爲答案。基本上設置日期然後.utc()它。而不是.utc()然後設置日期 - 現在有意義我想 - 我這樣做是這樣說的,這是一個UTC日期,而不是這是一個本地日期。 – Morvael

+0

進一步更新,似乎是從dd/mm/yyyy HH:mm:ss的英國格式中讀取中的用戶選定值,結果是moment.js在轉換後再次給出相同的值。 https://jsfiddle.net/r68owagL/2/爲了解決,我必須在將它傳遞給moment()之前手動將格式設置爲yyyy-MM-dd HH:mm:ss。 – Morvael

+0

@Morvael,你會得到一個貶低警告,那個時刻建設回落到JS日期。您需要爲日期指定格式。那麼你將不必手動解析。請參閱http://momentjs.com/guides/#/warnings/js-date/和http://momentjs.com/guides/#/parsing/known-formats/ –