在PHP/MySQL/JavaScript系统中计算时间差
我想知道最好的方法是计算从现在到某一点的时间差,比如倒计时时间 我有一个拍卖,在某一点上有一个关闭时间,这个时间以“DATETIME 00-00-000 00:00:00”的格式存储在MySQL记录中。此记录称为closetime 现在在我的网站上,我有JavaScript代码,这次通过PHP文件获取。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
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";
?>