2014-01-30 57 views
0

我在網站上有一個倒數計時器(它充當同一天發貨倒計時器,因此訪問者知道他們是否下了訂單,如果他們今天發貨)。基本上,計時器在星期一至星期五倒數至下午5點,然後以「0」(午夜,24小時)重新開始,這一切都正常。將JavaScript日期()轉換爲UTC和抵消時間

然後我意識到,因爲時間是客戶端(JavaScript)的遊客在PST時區會看到一個錯誤的時間相比,他們應該看到我們的(店東)。

不幸的是我不能使用PHP或任何服務器端從服務器獲取時間,所以它必須是JavaScript的(轉換爲UTC和偏移量)。

我做得不對的變量,據我所知道的,可能更多的,可能有人請告訴我,我究竟錯設置? (它不會在我的控制檯中顯示任何錯誤)。

if (document.getElementById('countdownTimer')) { 
    pad = function(n, len) { // leading 0's 
     var s = n.toString(); 
     return (new Array((len - s.length + 1)).join('0')) + s; 
    }; 
    function calcTime(offset) { 

     // create Date object for current location 
     var d = new Date(); 

     // convert to msec 
     // add local time zone offset 
     // get UTC time in msec 
     utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
     offset = -5.0; 
     var now = utc + (3600000*offset); 


    function countDown() { 
     //var now = new Date(); 
     if ((now.getDay() >= 1) && (now.getDay() <= 5)) { // Monday to Friday only 
      var target = 17; // 15:00hrs is the cut-off point 
      if (now.getHours() < target) { // don't do anything if we're past the cut-off point 
       var hrs = (target - 1) - now.getHours(); 
       if (hrs < 0) hrs = 0; 
       var mins = 59 - now.getMinutes(); 
       if (mins < 0) mins = 0; 
       var secs = 59 - now.getSeconds(); 
       if (secs < 0) secs = 0; 
       var str = '<span id="day">00</span><span id="hour">' + pad(hrs, 2) + '</span><span id="minute">' + pad(mins, 2) + '</span><span id="second">' + pad(secs, 2) + '</span>'; 
       document.getElementById('countdownTimer').innerHTML = str; 
      } 
     } 
    } 
    var timerRunning = setInterval('countDown()', 1000); 
} 
} 
+0

大多數服務器發出ajax HEAD請求可以獲取的Date標頭。你也可以從5 * 3600000中減去它們的偏移量以得到他們的時間與E.S.T.之間的差值。 – dandavis

+0

@dandavis這是一個很大的商業託管網站,所以我不確定他們是如何配置的。我知道他們的API不會返回商店時區。 –

+0

您可以轉到javascript在Chrome上運行的頁面,按F11,然後按F5,單擊網絡選項卡,單擊第一個輸入行,然後單擊標題以看看日期是否在其中。如果是的話,那麼谷歌「阿賈克斯頭標題」。 – dandavis

回答

2

我看到,在這些行:

// convert to msec 
    // add local time zone offset 
    // get UTC time in msec 
    utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
    offset = -5.0; 
    var now = utc + (3600000*offset); 

你創建一個now變量爲一個數字,然後在你的函數countDown()你使用它作爲一個日期的對象。 您應該創建now var當成這樣

var now = new Date(utc + (3600000*offset)); 
+0

這結束了我使用和解決問題的解決方案,或多或少。 –

+0

我認爲'offset'應該是' - (d.getTimezoneOffset()/ 60)',而不是定義'-5.0',因爲這不考慮DST ......但讓我知道 - 我不是確定這將是多麼「普遍」。 –

0

約會我只是沒這個設定一個到期node.js的頭......這裏就是我所做的:

res.setHeader("Expires", new Date(Date.now() + 345600000).toUTCString()); 

其他應用程序你可以做不同的事情:

var updated_date = new Date(Date.now() + 345600000, //miliseconds 
    utc_date = updated_date.toUTCString() 

玩得開心!

相關問題