Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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/MySQL/JavaScript系统中计算时间差_Php_Javascript_Ajax_Datetime - Fatal编程技术网

在PHP/MySQL/JavaScript系统中计算时间差

在PHP/MySQL/JavaScript系统中计算时间差,php,javascript,ajax,datetime,Php,Javascript,Ajax,Datetime,我想知道最好的方法是计算从现在到某一点的时间差,比如倒计时时间 我有一个拍卖,在某一点上有一个关闭时间,这个时间以“DATETIME 00-00-000 00:00:00”的格式存储在MySQL记录中。此记录称为closetime 现在在我的网站上,我有JavaScript代码,这次通过PHP文件获取。JavaScript每秒使用setInterval 1000循环一次。PHP文件从数据库中获取closetime,并以这种格式将其发送回数据库 strtotime($result['closeti

我想知道最好的方法是计算从现在到某一点的时间差,比如倒计时时间

我有一个拍卖,在某一点上有一个关闭时间,这个时间以“DATETIME 00-00-000 00:00:00”的格式存储在MySQL记录中。此记录称为closetime

现在在我的网站上,我有JavaScript代码,这次通过PHP文件获取。JavaScript每秒使用
setInterval 1000
循环一次。PHP文件从数据库中获取closetime,并以这种格式将其发送回数据库

strtotime($result['closetime']);
我得到请求的时间,我想使用服务器时间,而不是JavaScript中的时间,因为用户的时钟可以关闭

strtotime(date("H:i:s", $_SERVER['REQUEST_TIME']))
我发回这两个时间戳,并用JavaScript计算它们之间的时间差。我使用这个函数来实现它,从PHP返回的值我调用currentTime和closeTime,我认为这应该是清楚的

function auctionDelayTime(currentTime,closeTime){
    totaldelay = closeTime - currentTime;
    if(totaldelay <= 0){
        return 'ended';
    }else{
        if( days=parseInt((Math.floor(totaldelay/86400))) )
            totaldelay = totaldelay % 86400;
        if( hours=parseInt((Math.floor(totaldelay/3600))) )
            totaldelay = totaldelay % 3600;
      if( minutes=parseInt((Math.floor(totaldelay/60))) )
            totaldelay = totaldelay % 60;
        if( seconds=parseInt((Math.floor(totaldelay/1))) )
            totaldelay = totaldelay % 1;

        return hours+':'+formatTimes(minutes)+':'+formatTimes(seconds);
    }
}
function formatTimes(value){
    return value < 10 ? '0'+value : value;
}
函数auctionDelayTime(currentTime,closeTime){
totaldelay=关闭时间-当前时间;
如果(总延迟使用

注:奇怪的是,小时值比我预期的要大一倍,原因我不明白。看起来“1970年1月1日午夜”是在凌晨1点:-)

更新:1的差异是由于我的时区偏移(GMT+1)

解决这一问题的微小变化:

var d = new Date();
var offset = d.getTimezoneOffset() * 60000;
var d = new Date(difference_in_milliseconds + offset);
var seconds = d.getSeconds();
var minutes = d.getMinutes();
var hours = d.getHours();

这很容易使用,可能会很好地为您服务。

为什么不让php页面给您带来不同

$sql = "SELECT UNIX_TIMESTAMP(NOW()) as currentTime, UNIX_TIMESTAMP(closeTime) as closeTime FROM yourTable WHERE yourRecordId = '123'";

$query = mysql_query($sql);

$result = mysql_fetch_assoc($query);

echo timeRemaining($result['currentTime'], $result['closeTime']);

function timeRemaining($start, $end) {
    $dateDiff = $end - $start;
    if ($dateDiff <= 0) { return 'Ended'; }
    $fullDays = floor($dateDiff/(60*60*24));
    $fullHours = floor(($dateDiff-($fullDays*60*60*24))/(60*60));
    $fullMinutes = floor(($dateDiff-($fullDays*60*60*24)-($fullHours*60*60))/60);
    return "Ending in $fullDays days, $fullHours hours and $fullMinutes minutes.";   
}
$sql=“从您的表中选择UNIX_TIMESTAMP(NOW())作为当前时间,选择UNIX_TIMESTAMP(closeTime)作为closeTime,其中您的RecordId='123';
$query=mysql\u查询($sql);
$result=mysql\u fetch\u assoc($query);
回显剩余时间($result['currentTime'],$result['closeTime']);
函数剩余时间($start,$end){
$dateDiff=$end-$start;

如果($dateDiff您真的必须每1000毫秒通过AJAX获得时间吗? (我想你希望在最近的时间里有所改变?…)

但是如果您真的必须这样做,我建议直接在MySQL中获取时差,以简化代码

$sql = "SELECT TIMEDIFF(NOW(), `CreateTime`) from `Table` WHERE `id`=1;"
有一种支持通过AJAX进行服务器同步的方法:

从:

将客户的时间与 通过提供 返回当前值的函数 服务器日期和时间。此日期和时间 时间应该考虑到 服务器的时区和任何差异 在这段时间和客户的 应用于倒计时时 开始或改变

下面的示例使用一个PHP 服务器上的程序返回 当前服务器时间,格式为 可以由JavaScript直接使用 回拨。你应该确保 您的服务器调用是同步的

serverTime.php:

<?php 
$now = new DateTime(); 
echo $now->format("M j, Y H:i:s O")."\n"; 
?>


我相信这是因为您计算机上的时区。0的时间戳是1970年1月1日00:00。UTCI将尝试这种方法。您认为用php或javascript计算时间会更快吗?我不会为计算速度而烦恼。两种方法都会非常快。我更喜欢php方面,它会更可靠。天秤座y可能很方便,但我认为这是一件非常简单的事情,我更喜欢使用原始代码而不是整个库。但我一定会去看看,谢谢你的时间。我在在线考试申请中使用这个插件。我可以在倒计时达到零时添加一个事件处理程序来自动提交页面。这个插件很容易使用,很简单为了扩展,所以我建议您尝试一下。我的应用程序,我不关心用户的浏览时间。我只是将剩余的秒数传递给插件,它显示剩余的时间。不需要资源密集的AJAX,只需显示剩余的时间。假设有1000个用户,每秒同时执行AJAX请求,您的主机可能会不要将其视为DDoS攻击:)这个方法对我来说不太好。约瑟夫描述的方法成功了。这个插件只给了我服务器时间,它不会计算两个给定时间之间的任何差异。每秒都会有很多计算。每个用户都必须每秒运行一次。因此,如果有1000个用户,就会有很多php计算服务器每秒执行一次操作。如果在javascript中执行此操作,将是浏览器的工作,而不是我的服务器。这是一个相当小的计算,不会占用服务器太多时间,但我认为经过大量时间和大量点击,这确实会产生轻微的差异。您认为使用NOW()等函数的解决方案会有什么影响在mysql中,我听说大型应用程序的扩展性不好,有一些资源可以在线阅读。最好用PHP获取时间并将其插入查询中。其次,我想把重点放在浏览器端,而不是服务器端。我希望PHP尽可能快地运行,并将请求返回给用户。浏览器可以完成其余的计算。
$(selector).countdown({ 
    until:liftoffTime, serverSync: serverTime}); 

function serverTime() { 
    var time = null; 
    $.ajax({url: 'http://myserver.com/serverTime.php', 
        async: false, dataType: 'text', 
        success: function(text) { 
            time = new Date(text); 
        }, error: function(http, message, exc) { 
            time = new Date(); 
    }}); 
    return time; 
}
<?php 
$now = new DateTime(); 
echo $now->format("M j, Y H:i:s O")."\n"; 
?>