Как я получаю обратный отсчет времени с помощью PHP?
Я хочу отобразить что-то как 3 Дня 4 Часа. Я имею поле даты, прибывающее из таблицы MySQL, и хочу вычислить ее с сегодняшней датой. На данный момент у меня есть только дата а не время, сохраненное в базе данных, но в конечном счете я буду. Таким образом, в то время я мог бы показать 3 Днями 4 Часа 10 Минут 43 секунды.
Это - то, что я попробовал, но получаю некоторый неправильный ответ:
$datetime1 = new DateTime($starton);//$starton - date stored in db
$datetime2 = new DateTime(date());
$interval = $datetime1->diff($datetime2);
echo $interval->format('%d days);
Я смущен, если это работает базирующееся времени сервера или зоны, куда пользователь происходит из. Ведите меня. Когда у меня есть поле времени, я предполагаю, что мне, возможно, понадобился бы jQuery для показа живых секунд и так минуты также.
IMHO, когда вы думаете о сравнении времени, вы автоматически начинаете говорить о времени Unix. По сути, время Unix - это счетчик в секундах, который всегда увеличивается. Когда у вас есть две метки времени Unix, вы можете использовать простую арифметику, чтобы вычислить разницу, а затем перевести разницу в удобочитаемую форму.
Обратите внимание, что временные метки Unix являются общими почти для всех языков программирования, поэтому вы можете выбрать, делать ли это в PHP, MySQL или JavaScript, и все может оказаться одинаковым. Я покажу вам версию PHP.
Итак, вы хотите сделать следующее:
Код PHP:
//Unix timestamp to Dec. 21, 2012 (midnight)
$unix_time = mktime(0,0,0,12,21,2012);
//Connect to MySQL
//"INSERT INTO table (target_timestamp) VALUES ($unix_time);"
//----- user goes to page -----
//Connect to MySQL
$sql = "SELECT target_timestamp FROM table WHERE foo = bar";
$unix_time = do_query($sql);//do_query not defined, assume it gets the timestamp
$current_time = time();
$diff = $unix_time - $current_time
//$diff should be positive and not 0
if( 1 > $diff ){
exit('Target Event Already Passed (or is passing this very instant)');
} else {
$w = $diff / 86400 / 7;
$d = $diff / 86400 % 7;
$h = $diff / 3600 % 24;
$m = $diff / 60 % 60;
$s = $diff % 60;
return "{$w} weeks, {$d} days, {$h} hours, {$m} minutes and {$s} secs away!"
}
Не 100% -ный ответ на ваш вопрос, но ручной способ сделать это будет следующим:
$start = strtotime($dbTime);
$now = time();
$differenceInSeconds = $start - $now;
Оттуда вам просто нужно отформатировать его, и вы можете найти алгоритм в этом ответе .
PHP будет использовать часовой пояс, установленный сервером, который можно вручную установить в вашем скрипте с помощью date_default_timezone_set ()
. Вы можете сделать это двумя способами:
Вы действительно можете использовать свой MySQL-запрос, чтобы произвести вычисления за вас. См. Функцию TimeDiff ()
: http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff . Затем вы можете использовать TimeFormat ()
, чтобы отформатировать его так, как вы хотите.
Как вариант, вы можете сделать это через PHP. Вы можете преобразовать в формат эпохи unix -> как дату. Другой вариант - начать с двух объектов DateTime, как вы это сделали. Попробуйте:
$datetime1 = new DateTime($starton);
$datetime2 = new DateTime();
$interval = $datetime1->diff($datetime2);
echo $interval->format('%d days);
Или процедурно:
$datetime1 = date_create($starton);
$datetime2 = date();
$interval = date_diff($datetime1,$datetime2);
echo $interval->format('%d days');
Также, если вы хотите отображать счетчик как счетчик обновления в реальном времени; вам, вероятно, придется передать это функции Javascript позже.
Это решение, с которым боролись некоторые фреймворки (например, Ruby on Rails), PHP, похоже, не является одним из них. , Я думаю, что вы ищете что-то вроде:
http://www.phpro.org/examples/Convert-Seconds-To-Hours-Minutes-Seconds-Words.html
Ну, я думаю, если вы вызываете date () на сервере, вы получите дату и часовой пояс сервера. Вы можете установить часовой пояс с помощью функции date_default_timezone_set ([TIMEZONE]);
, хотя, если это вызывает беспокойство.
Если бы я делал это и хотел бы посекундный обратный отсчет, я бы, вероятно, передал рассчитанный интервал в javascript и позволил jQuery выполнять форматирование, особенно если вам нужен активный счетчик.
В этом отношении вы можете выгрузить все это в javascript, передать ему две даты и использовать date1.getTime () - date2.getTime ()
, чтобы получить разницу во времени в миллисекундах, и сделайте математику самостоятельно в javascript (это заимствовано из этого ответа )
Вероятно, я бы так и поступил, если бы все равно менял его в JS.
Поскольку вы упомянули jQuery, это можно сделать только с помощью JavaScript, если вас это устраивает.
Плагин обратного отсчета jQuery и рабочий пример: http://keith-wood.name/countdown.html
Сохранит и вызовы в базу данных.