2014-01-30 55 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() 

玩得开心!

相关问题