2017-05-08 77 views
0

我試圖將UTC日期轉換爲我的節點服務器上的本地時間,最後以hh:mm:ss(不使用Moment JS)的格式返回本地時間。我將客戶端的時區偏移量傳遞給Node,即GMT-6。將本地化的ISO日期格式化爲hh:mm:ss

我原來的時間是:2017-05-05T00:25:11.378Z

// ISOTimeString = `2017-05-05T00:25:11.378Z` 
// offsetInMinutes = 360; (GMT - 6) 
function isoDateToLocalDate(ISOTimeString, offsetInMinutes) { 
    var newTime = new Date(ISOTimeString); 
    return new Date(newTime.getTime() - (offsetInMinutes * 60000)); 
} 

本地化時間是2017-05-04T18:25:11.378Z,其是正確的(2017-05-05T00:25:11 - 6 hours = 2017-05-04T18:25:11)。

// localIsoDate: 2017-05-04T18:25:11.378Z Date object 
function formatTime(localIsoDate) { 
    var hh = localIsoDate.getHours(); 
    var mm = localIsoDate.getMinutes(); 
    var ss = localIsoDate.getSeconds(); 
    return [hh, mm, ss].join(':'); 
} 

// formatted: 12:25:11 

的問題,同時仍然在服務器上,當我試圖格式化爲hh:mm:ss,它減去6小時,給我12:25:11。我不想再次轉換,我只想從已經本地化的時間格式化並顯示18:25:11

我該怎麼做?


注意:請記住,我沒有它傳回客戶端在我的情況後,時區轉換選項。

+1

在* formatTime *函數('localIsoDate.getUTCHours()'等)中使用UTC方法。 – RobG

回答

2

isoDateToLocalDate似乎是好了,但是在formatTime你需要使用UTC方法,否則,你所得到的主機本地值,而不是調整UTC值。另外,在ISO 8601術語(以及計算機外編程之外的常規慣例)中,360的偏移代表+600的時區,而不是-0600。見下面的註釋。

// ISOTimeString = 2017-05-05T00:25:11.378Z 
 
// ECMAScript offsetInMinutes = 360; (GMT-0600) 
 
function isoDateToLocalDate(ISOTimeString, offsetInMinutes) { 
 
    var newTime = new Date(ISOTimeString); 
 
    return new Date(newTime.getTime() - (offsetInMinutes * 60000)); 
 
} 
 

 
// localIsoDate: 2017-05-04T18:25:11.378Z Date object 
 
function formatTime(localIsoDate) { 
 
    function z(n){return (n<10?'0':'')+n} 
 
    var hh = localIsoDate.getUTCHours(); 
 
    var mm = localIsoDate.getUTCMinutes(); 
 
    var ss = localIsoDate.getUTCSeconds(); 
 
    return z(hh)+':'+z(mm)+':'+z(ss); 
 
} 
 

 
var timeString = '2017-05-05T00:25:11.378Z'; 
 
var offset = 360; 
 

 
console.log(formatTime(isoDateToLocalDate(timeString, offset)))

ECMAScript的時區的標誌是通常的慣例相反。如果客戶端時區偏移量爲+0600,則主機將顯示-360。