Как отобразить обратный отсчет времени с помощью PHP и MySQL - PullRequest
5 голосов
/ 24 июня 2010

Как получить отсчет времени с помощью PHP?

Я хочу показать что-то вроде 3Days 4Hours.У меня есть поле даты из таблицы MySQL и я хочу рассчитать его с сегодняшней датой.На данный момент у меня есть только дата, а не время, хранящееся в базе данных, но в конечном итоге я буду.Так что в то время я мог бы показать как 3Days 4Hours 10Minutes 43seconds.

Это то, что я пытался, но получаю неправильный ответ:

$datetime1 = new DateTime($starton);//$starton - date stored in db
$datetime2 = new DateTime(date());
$interval = $datetime1->diff($datetime2);
echo $interval->format('%d days);

Я запутался, если это работает на основе серверавремя или зона, откуда приходит пользователь.Пожалуйста, ведите меня.Когда у меня есть поле времени, я думаю, что мне может понадобиться jQuery для отображения секунд в реальном времени, а также минут.

Ответы [ 6 ]

3 голосов
/ 11 июля 2010

ИМХО, когда вы думаете о сравнении времени, вы автоматически начинаете говорить о времени Unix.По сути, время Unix - это счет в секундах, который всегда увеличивается.Когда у вас есть 2 метки времени 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!"
}
1 голос
/ 03 июля 2010

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

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

Спасет вас и ваши звонки на БД.

1 голос
/ 02 июля 2010

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

0 голосов
/ 06 июля 2010

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

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

0 голосов
/ 27 июня 2010

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

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

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

Вероятно, я так и сделал бы, если бы я все равно изменил это в JS.

0 голосов
/ 24 июня 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...