Javascript倒计时-客户端时间与mySQL时间

Javascript倒计时-客户端时间与mySQL时间,javascript,mysql,Javascript,Mysql,以下代码是一个倒计时计时器。它从mySQL中提取一个结束日期时间戳,并使用它来计数。问题是mysql时间可能与使用计时器查看页面的客户端位于不同的时区 我还使用NOW()从mySQL中提取了当前时间戳,认为这将允许计时器作为创建它的用户计数 如果我把NOW()值放在这个代码段中 var timeDiff = target - (new Date()); 像这样 var nt='2015-03-11 05:12:15'.split(/[- :]/); var timeDiff = target

以下代码是一个倒计时计时器。它从mySQL中提取一个结束日期时间戳,并使用它来计数。问题是mysql时间可能与使用计时器查看页面的客户端位于不同的时区

我还使用NOW()从mySQL中提取了当前时间戳,认为这将允许计时器作为创建它的用户计数

如果我把NOW()值放在这个代码段中

var timeDiff = target - (new Date()); 
像这样

var nt='2015-03-11 05:12:15'.split(/[- :]/);
var timeDiff = target - (new Date(nt[0],nt[1]-1,nt[2],nt[3],nt[4],nt[5]));
计数器显示页面加载时剩余的正确时间,但不再以交互方式计数。我想我需要获得客户端本地时间和mySQL NOW()之间的小时差,并调整此行中的日期,以使交互式计时器运行

var timeDiff = target - (new Date());  
我尝试的东西似乎都不管用

如果客户端恰好位于同一时区,则这是工作脚本

 <script language="javaScript">              
  document.write(hrs);
  function timeDiff(target) {
    function z(n) {return (n<10? '0' : '') + n;}
    var timeDiff = target - (new Date()); 
    var hours    = timeDiff / 3.6e6 | 0;
    var minutes  = timeDiff % 3.6e6 / 6e4 | 0;
    var seconds  = timeDiff % 6e4 / 1e3 | 0;
    if (hours<0 || minutes<0 || seconds<0) {
      document.getElementById('divBody').style.display='none';
      document.getElementById('divExpired').style.display='';    
      return '<b>EXPIRED</b>';
      }
    else {
      return '<b>' + z(hours) + '</b> Hours, <b>' + z(minutes) + '</b>  Mins, <b>' + z(seconds) + '</b> Secs';
      }
    }
  function doCountDown(target) {
    document.getElementById('timer').innerHTML = '<img src=\"/backhaul/images/my/al-active.png\" class=\"vm2\" /> <span style=\"color:#c40000\"><b>EXPIRES IN</b></span>: ' + timeDiff(target);
    var lag = 1020 - (new Date() % 100);
    setTimeout(function(){doCountDown(target);}, lag);
    }
  window.onload = function() {
    //Insert Expiratin Date from mySQL into t var
    var t='2015-03-12 00:00:00'.split(/[- :]/);
    doCountDown(new Date(t[0],t[1]-1,t[2],t[3],t[4],t[5]));
  }
</script>

文件记录(小时);
函数timeDiff(目标){

函数z(n){return(n有很多方法可以实现这一点,但我将详细介绍两种方法

方法1:在客户端调整时间 一种方法是您正在尝试做的事情,即获取服务器的当前时间并找出与客户端当前时间的差异。您只需将服务器目标时间调整为客户端的时间。这可以通过

var serverDifference=Date.parse(mysql_data.now)-Date.now()
var target=Date.parse(mysql_data.server_time_in_two_hours)-serverDifference
然后您可以毫无问题地将其输入到函数中

方法2:计算服务器端的剩余时间 由于您只需要一个倒计时计时器,我认为只需将秒数发送到服务器端就更合适了

 select timestampdiff(SECOND,now(),end_time) seconds_left from timers;
然后,您只需根据剩余的秒数而不是目标日期进行倒计时。您可以通过从服务器接收的时间中减去javascript运行的时间来计算剩余的秒数

var client_start=Date.now()
function timeDiff_fromseconds(target) {
    function z(n) {return (n<10? '0' : '') + n;}
    var timeDiff =target-(Date.now()-client_start)
    var hours    = timeDiff / 3.6e6 | 0;
    var minutes  = timeDiff % 3.6e6 / 6e4 | 0;
    var seconds  = timeDiff % 6e4 / 1e3 | 0;
    if (hours<0 || minutes<0 || seconds<0) {   
      return '<b>EXPIRED</b>';
      }
    else {
      return '<b>' + z(hours) + '</b> Hours, <b>' + z(minutes) + '</b>  Mins, <b>' + z(seconds) + '</b> Secs';
      }
}
var client\u start=Date.now()
函数timeDiff_fromseconds(目标){

函数z(n){return(n如果可以从数据库中获得剩余的秒数,而不是到期时间(意味着在服务器上计算秒数并发送到客户端),那么可以使用以下代码(示例)

var倒计时id;
无功定时器;
函数倒计时(){
console.log(计时器--);

if(timer)请等待更好的注释/答案,因为我没有必要的知识。无论如何,如果您必须使用时区,最好使用SQL中的datetimes(MySQL具有日期转换功能);Javascript可以支持该格式,但如果不支持,您可以使用So将其转换为UTC…
setInterval()
使用内置的AJAX调用可能是实现这一点的方法,这样您就不必处理客户机与服务器的时间。客户机时间通常取决于他们的计算机,当然他们可以更改。setInterval是一个不好的时间选择,因为排队的事件可能会漂移很多,特别是当线程变忙时,一个例如nfim()消息。使用客户端时间或精度会更可靠。now()为了避免客户端时钟调整。无论如何,你不需要php,只要从任何ajax请求中获取日期头,减去客户端日期,剩下的C/S偏移量以毫秒为单位。我想你可能会发现在代码的多个方面都非常方便。这是一个很好的JS库,用于使用JavaSc解析、验证、操作和显示日期cript.我不认为你在#1上的缺点是必要的。即使时钟完全关闭,两者仍然每秒前进1秒,滞后很少超过1000毫秒。没有任何东西表明你不能简单地计算第一个代码所需的#秒数,然后将其输入到第二个代码。@dandavis是的,再想想,你是对的。谢谢。migh那场演出不值得一提更精确,并忽略在选项卡打开后进行的本地时钟调整。@dandavis谢谢,我已经添加了它in@dandavis实际上,时差可能很大。我总是使用方法2的一个版本,因为你不知道用户时钟的设置有多糟糕。但是你可以想象,23秒前在这两种方法上的时间是相同的服务器和客户端。方法2是您应该使用的方法:)
var countDownId;
var timer;
function countDown(){
    console.log(timer--);
    if(timer<=0){
        clearInterval(countDownId);
        alert('time expired');
    }
}

function startCountDown(secondsToExpire){
    var milliseconds = 1 * 1000 ;// 1 second
    timer = secondsToExpire;

    countDownId = setInterval(function() { countDown();},milliseconds);
}

  window.onload = function() {
    //Insert remaining time from expiration
    var timeRemaining = 5;
    startCountDown(timeRemaining);
  }