Вычисление разницы во времени в системе 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;"