HI, у меня есть несколько сообщений на моем сервере базы данных MySql, один из информационных материалов в каждом сообщении – это дата и время в формате datetime (пример 2010-11-26 21:55:09), когда сообщение было сделано ,
Итак, я хочу получить фактическую дату и время с SQL-сервера с помощью функции NOW () и подсчитывает, сколько секунд или минут или часов или дней назад было опубликовано сообщение.
Я не знаю, как создать этот php-скрипт, но я знаю, что наверняка уже сделано, поэтому благодарим за любую помощь.
Как сказал биллиекид, вы можете использовать date_diff()
если вы используете PHP5.3 +, если вы не являетесь, тогда существуют различные методы. Как показали другие плакаты. Самый быстрый метод в MySQL, если вы хотите узнать время, разделенное на иерархию «hours: mins: secs», – это использовать функцию TIMEDIFF () .
SELECT TIMEDIFF(NOW(), '2010-11-26 12:00:00');
Если вы хотите использовать это как секунды, используйте функции timestamp unix в MySQL или PHP, вы можете быстро преобразовать даты MySQL в PHP с помощью strtotime()
.
вы можете использовать функцию date_diff ()
http://php.net/manual/en/function.date-diff.php
Что-то вроде…
<?php $now = time(); $then = $posttime; $diff = date_diff($now,$then); echo $diff->format('%R%d days'); #change format for different timescales ?>
редактировать —
Я действительно решаю эту проблему в одном из моих приложений Twitter, используя эту функцию …
function time_since ( $start ) { $end = time(); $diff = $end - $start; $days = floor ( $diff/86400 ); //calculate the days $diff = $diff - ($days*86400); // subtract the days $hours = floor ( $diff/3600 ); // calculate the hours $diff = $diff - ($hours*3600); // subtract the hours $mins = floor ( $diff/60 ); // calculate the minutes $diff = $diff - ($mins*60); // subtract the mins $secs = $diff; // what's left is the seconds; if ($secs!=0) { $secs .= " seconds"; if ($secs=="1 seconds") $secs = "1 second"; } else $secs = ''; if ($mins!=0) { $mins .= " mins "; if ($mins=="1 mins ") $mins = "1 min "; $secs = ''; } else $mins = ''; if ($hours!=0) { $hours .= " hours "; if ($hours=="1 hours ") $hours = "1 hour "; $secs = ''; } else $hours = ''; if ($days!=0) { $days .= " days "; if ($days=="1 days ") $days = "1 day "; $mins = ''; $secs = ''; if ($days == "-1 days ") { $days = $hours = $mins = ''; $secs = "less than 10 seconds"; } } else $days = ''; return "$days $hours $mins $secs ago"; }
Вы передаете его в временную метку unix времени, чтобы проверить (время сообщения), и она возвращает различную строку.
Обычно вы делаете такие вещи в запросе, но MySQL не очень хорош с интервалами (с PostgreSQL это будет очень легко). Вы можете преобразовать его в временную метку unix, тогда она даст количество секунд между двумя датами:
SELECT UNIX_TIMESTAMP() - UNIX_TIMESTAMP(your_datetime_column);
Я думал о DATEDIFF, но он возвращает количество дней между двумя датами.
Вы можете сделать это в PHP, например, с помощью класса DateTime:
$date1 = new DateTime(); $date2 = new Datetime('2010-11-26 12:00:00'); var_dump($date1->diff($date2));
(Существует процедурный способ сделать это, если вы не являетесь поклонником ООП.)
Это определенно решение, которое я бы использовал, если я не могу сделать это с помощью РСУБД. DateTime :: diff возвращает объект DateInterval, который содержит количество секунд, минут, часов, дней и т. Д. Между двумя датами.
Вы также можете сделать это со временными метками в PHP:
$num_sec = time() - strtotime('2010-11-26 12:00:00');
Который возвратит то же самое, что и запрос SQL.
В SQL-запросе возможно простое решение:
SELECT UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(post_date) AS seconds_ago FROM posts
Документация здесь: MySQL Ref