2016-10-26 50 views
1

我有一個倒計時器下面的JavaScript代碼:的Javascript倒數計時器在GMT/UTC

var end = new Date('10/26/2016 4:00 PM'); 

var _second = 1000; 
var _minute = _second * 60; 
var _hour = _minute * 60; 
var _day = _hour * 24; 
var timer; 

function showRemaining() { 
    var now = new Date(); 
    var distance = end - now; 
    if (distance < 0) { 

     clearInterval(timer); 
     document.getElementById('countdown').innerHTML = 'EXPIRED!'; 

     return; 
    } 
    var days = Math.floor(distance/_day); 
    var hours = Math.floor((distance % _day)/_hour); 
    var minutes = Math.floor((distance % _hour)/_minute); 
    var seconds = Math.floor((distance % _minute)/_second); 

    document.getElementById('countdown').innerHTML = minutes + 'mins ' + seconds + 'secs'; 
} 

timer = setInterval(showRemaining, 1000); 

這工作,但問題是我需要的倒數計時器上GMT/UTC時間,我的所有時間工作在站點/服務器上都以這種方式存儲。

此刻此倒數計時器正在使用now設置的用戶當地時間。該腳本將在全球範圍內訪問,因此我不能使用本地時區,它必須採用GMT/UTC格式。

即截至發佈時間,當前GMT時間爲13:17,但如果我在英國訪問腳本,當地時間是14:17,因此倒計時超過1小時。

我知道JavaScript有

toUTCString() 

方法,但是當我試圖把這種對

function showRemaining() { 
    var now = new Date().toUTCString(); 
    ... 

它導致這樣的輸出:

NaNmins NaNsecs 

的jsfiddle在這裏=>https://jsfiddle.net/pzbz35q1/1/

+0

沒有 「本地」 Date對象,他們都是UTC。字符串「10/26/2016 4:00 PM」沒有時區偏移量,因此如果解析爲日期將爲具有不同時區偏移量的每個主機顯示不同的時間。 – RobG

回答

0

我已經使用類似的東西以下之前:

var now = new Date(); 
var nowUTC = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(), now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds()); 
var distance = end - nowUTC; 

的.toUTCString()將會把當前UTC日期/時間的字符串中的變量,因此基於關閉任何計算它會失敗(因爲它是試圖從一個字符串計算一個數字)。

+0

謝謝。這樣可行。剛發佈後,我也發現我可以這樣做'var now = new Date(); var gmt = new Date(now.getTime()+ now.getTimezoneOffset()* 60000);'也可以工作 –

+0

Date的時間值已經是UTC了,您正在做的是調整UTC時間值,以便當應用時區偏移時,它會返回與未調整的UTC值相同的本地值。您應該首先使用UTC方法。 – RobG

0

Javascript日期對象始終爲UTC。這是傳遞給構造函數的值以及由返回的值可能會被視爲本地方法的*方法。

Date構造函數解析「10/26/2016 4:00 PM」完全依賴於實現,結果可能是無效日期。如果正確解析,則應在主機系統的時區中將其視爲2016年10月26日16:00。主機偏移量將用於爲該日期和時間創建UTC時間值。請注意,使用mm/dd/yyyy格式對世界上大多數人羣都是不明確的,所以字符串的格式應該提供給解析器。

如果你想 「2016年10月26日下午4:00」 作爲UTC處理,那麼你應該分析它是這樣:

/* Parse string in mm/dd/yyyy hh:mm ap format as UTC. 
 
** '10/26/2016 4:23 PM' 
 
** @param {string} s - string in required format 
 
** @returns {Date} - if string is invalid then an invalid Date is returned 
 
*/ 
 
function parseAsUTC(s) { 
 
    var b = s.split(/\D/); 
 
    var hr = b[3]%12 + (/pm$/i.test(s)? 12 : 0); 
 
    var d = new Date(Date.UTC(b[2], --b[0], b[1], hr, b[4])) 
 
    return d && d.getUTCMonth() == b[0] && d.getUTCHours() == hr? d : new Date(NaN); 
 
} 
 

 
var d = parseAsUTC('10/26/2016 4:23 PM'); 
 
console.log('UTC date: ' + d.toISOString() + '\n' + 
 
      'Local equivalent: ' + d.toLocaleString());