Как отобразить обратный отсчет времени с помощью PHP и MySQL

Как я получаю обратный отсчет времени с помощью 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 для показа живых секунд и так минуты также.

5
задан Peter Mortensen 12 September 2010 в 17:20
поделиться

6 ответов

IMHO, когда вы думаете о сравнении времени, вы автоматически начинаете говорить о времени Unix. По сути, время Unix - это счетчик в секундах, который всегда увеличивается. Когда у вас есть две метки времени Unix, вы можете использовать простую арифметику, чтобы вычислить разницу, а затем перевести разницу в удобочитаемую форму.

Обратите внимание, что временные метки Unix являются общими почти для всех языков программирования, поэтому вы можете выбрать, делать ли это в PHP, MySQL или JavaScript, и все может оказаться одинаковым. Я покажу вам версию PHP.

Итак, вы хотите сделать следующее:

  1. Найдите временную метку Unix для вашего целевого события
  2. Сохраните ее в базе данных MySQL
  3. Получите из базы данных
  4. Получите текущую временную метку Unix
  5. Вычтите, чтобы получить разница
  6. Умножение / деление для получения удобочитаемого формата

Код 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!"
}
3
ответ дан 14 December 2019 в 18:58
поделиться

Не 100% -ный ответ на ваш вопрос, но ручной способ сделать это будет следующим:

$start = strtotime($dbTime);
$now = time();
$differenceInSeconds = $start - $now;

Оттуда вам просто нужно отформатировать его, и вы можете найти алгоритм в этом ответе .

0
ответ дан 14 December 2019 в 18:58
поделиться

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 позже.

1
ответ дан 14 December 2019 в 18:58
поделиться

Это решение, с которым боролись некоторые фреймворки (например, Ruby on Rails), PHP, похоже, не является одним из них. , Я думаю, что вы ищете что-то вроде:

http://www.phpro.org/examples/Convert-Seconds-To-Hours-Minutes-Seconds-Words.html

0
ответ дан 14 December 2019 в 18:58
поделиться

Ну, я думаю, если вы вызываете date () на сервере, вы получите дату и часовой пояс сервера. Вы можете установить часовой пояс с помощью функции date_default_timezone_set ([TIMEZONE]); , хотя, если это вызывает беспокойство.

Если бы я делал это и хотел бы посекундный обратный отсчет, я бы, вероятно, передал рассчитанный интервал в javascript и позволил jQuery выполнять форматирование, особенно если вам нужен активный счетчик.

В этом отношении вы можете выгрузить все это в javascript, передать ему две даты и использовать date1.getTime () - date2.getTime () , чтобы получить разницу во времени в миллисекундах, и сделайте математику самостоятельно в javascript (это заимствовано из этого ответа )

Вероятно, я бы так и поступил, если бы все равно менял его в JS.

0
ответ дан 14 December 2019 в 18:58
поделиться

Поскольку вы упомянули jQuery, это можно сделать только с помощью JavaScript, если вас это устраивает.

Плагин обратного отсчета jQuery и рабочий пример: http://keith-wood.name/countdown.html

Сохранит и вызовы в базу данных.

1
ответ дан 14 December 2019 в 18:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: