Вычисление разницы во времени в системе PHP/MySQL/JavaScript
Мне было интересно, как лучше всего вычислить разницу во времени отныне до определенной точки, скажем, время обратного отсчета.
У меня есть аукцион, у которого есть близость в определенный момент, на этот раз хранится в записи MySQL в формате "DATETIME 00-00-000 00:00:00". Эта запись называется closetime.
Теперь на моем веб-сайте у меня есть код JavaScript, который получает это время через файл PHP. JavaScript повторяется каждую секунду, используя setInterval 1000
. PHP файл получает время от db и отправляет его обратно в этом формате
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;
}
Я думаю, что это очень много кода, делайте что-то настолько простое. У кого-нибудь есть лучшее решение или, возможно, более "красивый" код.
Наслаждайтесь!
Ответы
Ответ 1
Используйте объект Date.
var d = new Date(difference_in_milliseconds);
var seconds = d.getSeconds();
var minutes = d.getMinutes();
var hours = d.getHours() - 1; //See note
Примечание. Как ни странно, значение часов больше на единицу, чем я ожидал бы по причине, которую я не понимаю. Похоже, "полночь 1 января 1970 года" была в 1:00: -)
UPDATE: разница в 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();
Ответ 2
В php вы также можете сделать это следующим образом:
$time_period = ( $tEnd - $tStart );
$time_increments = array( 'days' => 86400, 'hrs' => 3600, 'mins' => 60, 's' => 1 );
## will hold our values for ( day, minute, hour, seconds )
$time_span = array();
## cycle through time_increments
while( list( $key, $value ) = each( $time_increments )) {
$this_value = (int) ( $time_period / $value );
$time_period = ( $time_period % $value );
# save value
$time_span[$key] = $this_value;
}
## show results
while( list( $key, $value ) = each( $time_span )) {
print "$value $key ";
}
ИЗМЕНИТЬ, как сказал Йозеф:
$tEnd = mktime(14,15,00,1,7,2009);
$tStart = mktime(15,10,00,12,5,2006);
$time_period = ( $tEnd - $tStart );
echo date("z H:i:s", $time_period);
результат: 33 '23: 05: 00 ': S
Ответ 3
Существует jquery Countdown Plugin, который поддерживает синхронизацию с сервером через AJAX:
Из docs:
Синхронизировать время клиента с сервера, предоставляя функция, возвращающая текущий дата и время сервера. Эта дата и времени следует учитывать часовой пояс сервера и любая разница между тем временем и клиентом применяется к обратному отсчету, когда он запущен или изменен.
В следующем примере используется PHP на сервере, чтобы вернуть текущее время сервера в формате, который могут быть использованы непосредственно с помощью JavaScript Перезвони. Вы должны убедиться, что ваш серверный синхронный вызов.
$(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;
}
serverTime.php:
<?php
$now = new DateTime();
echo $now->format("M j, Y H:i:s O")."\n";
?>
Ответ 4
Эта библиотека JavaScript проста в использовании и, вероятно, послужит вам хорошо.
Ответ 5
Почему бы вам не получить 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.";
}
Ответ 6
Вам действительно нужно получать время через AJAX каждые 1000 мс?
(я полагаю, вы надеетесь на изменения в ближайшее время?)
Но если вы действительно должны сделать это таким образом, я бы предложил получить разницу во времени непосредственно в MySQL для простоты кода.
$sql = "SELECT TIMEDIFF(NOW(), `CreateTime`) from `Table` WHERE `id`=1;"