Javascript倒计时-客户端时间与mySQL时间
以下代码是一个倒计时计时器。它从mySQL中提取一个结束日期时间戳,并使用它来计数。问题是mysql时间可能与使用计时器查看页面的客户端位于不同的时区 我还使用NOW()从mySQL中提取了当前时间戳,认为这将允许计时器作为创建它的用户计数 如果我把NOW()值放在这个代码段中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
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);
}