Расчет разницы во времени в системе PHP / MySQL / JavaScript - PullRequest
4 голосов
/ 07 января 2010

Мне было интересно, как лучше всего рассчитать разницу во времени с настоящего момента до определенной точки, скажем, времени обратного отсчета.

У меня есть аукцион, в котором в определенный момент есть время закрытия, это время сохраняется в записи MySQL в формате «DATETIME 00-00-000 00:00:00». Эта запись называется closetime.

Теперь на моем сайте у меня есть код JavaScript, который получает это время через файл PHP. JavaScript повторяется каждую секунду, используя setInterval 1000. PHP-файл получает время закрытия из БД и отправляет его обратно в этом формате

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

Я думаю, что очень много кода делает что-то настолько простое. У кого-нибудь есть лучшее решение или, может быть, более «красивый» код.

Наслаждайтесь!

Ответы [ 5 ]

1 голос
/ 09 января 2010

Существует jquery плагин обратного отсчета , который поддерживает синхронизацию с сервером через AJAX:

Из документов :

Синхронизировать время клиента с что на сервере, предоставляя функция, которая возвращает текущий дата и время на сервере. Эта дата и время должно учитывать часовой пояс сервера и любая разница между этим временем и клиентом применяется к обратному отсчету, когда это началось или изменилось.

В следующем примере используется 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"; 
?>
0 голосов
/ 08 января 2010

Вы действительно должны получать время через AJAX каждые 1000 мс? (я полагаю, что вы надеетесь на изменения в ближайшем будущем? ...)

Но если вам действительно нужно сделать это таким образом, я бы предложил получить разницу во времени непосредственно в MySQL для простоты кода.

$sql = "SELECT TIMEDIFF(NOW(), `CreateTime`) from `Table` WHERE `id`=1;"
0 голосов
/ 07 января 2010

Эта библиотека JavaScript проста в использовании и, вероятно, послужит вам хорошо.

0 голосов
/ 07 января 2010

Почему бы не дать странице 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.";   
}
0 голосов
/ 07 января 2010

Использование Объект даты .

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 час ночи: -)

ОБНОВЛЕНИЕ: разница в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...