Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在服务器端使用javascript倒计时_Php_Javascript_Datetime_Time - Fatal编程技术网

Php 在服务器端使用javascript倒计时

Php 在服务器端使用javascript倒计时,php,javascript,datetime,time,Php,Javascript,Datetime,Time,我有两个脚本,一个是用PHP获取时间服务器端,另一个是基于日期和时间的JavaScript倒计时。我不确定我做错了什么,但当我将日期和时间传递给javascript时,它会显示0天0小时1秒,然后过期。无论我在未来设定的日期和时间有多远,这种情况总会发生。如何将时间正确地传递到这个JavaScript代码中 <?php $date = 'July 19 2011 05:00:00 PM PDT'; $exp_date = "var end = new Date('". $date ."')

我有两个脚本,一个是用PHP获取时间服务器端,另一个是基于日期和时间的JavaScript倒计时。我不确定我做错了什么,但当我将日期和时间传递给javascript时,它会显示0天0小时1秒,然后过期。无论我在未来设定的日期和时间有多远,这种情况总会发生。如何将时间正确地传递到这个JavaScript代码中

<?php
$date = 'July 19 2011 05:00:00 PM PDT';
$exp_date = "var end = new Date('". $date ."');";
$todays_date = date("F j Y g:i:s A T");

if ($todays_date < $exp_date) {
?>
<script>
<?php echo $exp_date ;?>

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 = 'Days: ' + days + '<br />';
    document.getElementById('countdown').innerHTML += 'Hours: ' + hours+ '<br />';
    document.getElementById('countdown').innerHTML += 'Minutes: ' + minutes+ '<br />';
    document.getElementById('countdown').innerHTML += 'Seconds: ' + seconds+ '<br />';
}

timer = setInterval(showRemaining, 1000);
</script>
<?php
} else {
    echo "Times Up";
}
?>
<div id="countdown"></div>
var end=new Date();//设置到期日期和时间。。

你为什么用今天的日期作为结束日期(截止日期)?这可能是您的问题,除非我从根本上误解了您的代码。

您应该向客户端提供当前时间和结束时间,因为客户端使用自己的系统时间与服务器时间相对应

下面是这个问题的完整解决方案

<?php
$date = 'July 20 2011 05:00:00 PM PDT';
$exp_date = strtotime($date);
$now = time();

if ($now < $exp_date) {
?>
<script>
// Count down milliseconds = server_end - server_now = client_end - client_now
var server_end = <?php echo $exp_date; ?> * 1000;
var server_now = <?php echo time(); ?> * 1000;
var client_now = new Date().getTime();
var end = server_end - server_now + client_now; // this is the real end time

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 );

    var countdown = document.getElementById('countdown');
    countdown.innerHTML = '';
    if (days) {
        countdown.innerHTML += 'Days: ' + days + '<br />';
    }
    countdown.innerHTML += 'Hours: ' + hours+ '<br />';
    countdown.innerHTML += 'Minutes: ' + minutes+ '<br />';
    countdown.innerHTML += 'Seconds: ' + seconds+ '<br />';
}

timer = setInterval(showRemaining, 1000);
</script>
<?php
} else {
    echo "Times Up";
}
?>
<div id="countdown"></div>

//倒计时毫秒=服务器\u结束-服务器\u现在=客户端\u结束-客户端\u现在
var服务器端=*1000;
var server_now=*1000;
var client_now=new Date().getTime();
var end=server\u end-server\u now+client\u now;//这是真正的结束时间
var_秒=1000;
var _minute=_second*60;
变量(小时)=(分钟)*60 ;;
var _日=_小时*24
无功定时器;
函数showLeving()
{
var now=新日期();
var距离=结束-现在;
如果(距离<0){
清除间隔(计时器);
document.getElementById('countdown')。innerHTML='EXPIRED!';
返回;
}
var天数=数学楼层(距离/天数);
var小时=数学楼层((距离%\u天)/\u小时);
var分钟=数学楼层(距离%\u小时)/\u分钟);
var秒=数学楼层((距离%\u分钟)/\u秒);
var countdown=document.getElementById('countdown');
countdown.innerHTML='';
如果(天){
countdown.innerHTML+='Days:'+Days+'
; } countdown.innerHTML+='Hours:'+Hours+'
; countdown.innerHTML+='Minutes:'+Minutes+'
; countdown.innerHTML+='Seconds:'+Seconds+'
; } 定时器=设置间隔(显示剩余,1000);
我对@Ghostoy的
var distance=end-now有问题

我注意到我的秒数倒计时经常会暂停,偶尔跳过一个数字。当我显示距离时,我注意到毫秒有点来回移动

例如,当我观看距离倒计时时,以下是我的结果:

400996000
400995001
400993998
400993002
400991999
可能只是我的电脑,但如果问题发生在我的电脑上,那么它可能发生在其他人身上。因此,我建议将var距离更改为:

var distance = Math.round((end - now)/1000)*1000;

这把它固定在我的机器上。

哦,哇,我不知道。我是否将其放在
var end=new Date()之后?@sarsar请参阅我的更正。只需使用它们来替换行
var end=…
@sarsar我的观点是服务器时间可能不同于用户时间。通常不同的只是几秒钟或几分钟,并不是什么大问题。但当用户故意将时间更改为更早或更晚的时间时,例如3小时前,它会破坏您的计数器。因此,我上面的代码修复了这个客户机-服务器时间问题。@sarsar我发布了整个解决方案并对自己进行了测试。非常感谢哇!太神了如果我能为最后一件事打扰你?假设我设定了一个持续不到一小时的过期时间。这将使天和小时显示为0。我该如何隐藏几天和几个小时来缩短有效期?
var distance = Math.round((end - now)/1000)*1000;