Здравствуйте, Подскажите пожалуйста, как показать сколько времени прошло с момента публикации... Нужно выводить дату в таком формате, например: 25 minutes ago, 1 day ago, 2 days ago и т.д. Если прошло очень много времени тогда показывать дату в таком формате: Apr 05 Дата публикации имеет вид: YYYY-mm-dd HH:ii:ss
Сначала надо решить где именно форматировать дату: в mysql, php или javascript Мне кажется естественным делать это именно в JS, т.к. если страницу не обновлять, время типа "5 минут назад" через минуту становится "6 минут назад" ))) То есть мы должны формировать страницу с датой-временем отформатированным всегда одинаково, вообще не париться об этом. А дальше пусть трудится jQuery или еще что.
Такой вывод дат используют многие сайты. Вывод нужно делать в неком интервале, а не каждую минуту, например: в интервале (10 минут) - "5 минут назад" - "15 минут назад" - "25 минут назад" - "35 минут назад" и т.д. Я думаю это можно реализовать через php, текущая дата - дата публикации = разница. Не могу понять как сделать вывод минут, а после еще дня (1 день назад) и даты (Apr 05)...
lemonl, не могу понять в чем проблема с минутами ) забудь про "интервалы". если не изобретать ничего, в php принято держать дату-время как unixtime, т.е. как число секунд с дня X. разница между двумя датами < 60 это "менее 1 минуты", < 300 "это менее 5 минут" и т.д. — дни, месяцы и годы. всё в секундах, понимаешь? проблема возникает только когда выбирают <матное слово> способ хранения, отличный от числового. типа "чтобы в phpmyadmin выводилось красиво". как будто вашему пользователю не п о х у й как оно выглядит там внутри.
таймштамп отлично выводится в сеукндах и в дате. не надо гнать на грамотный подход, из за того, что криворукие проеры не умеют работать с мускулом.
Пользователю-то может и всё равно, но мне - нет. Если придётся вдруг копаться в базе вручную, через phpMyAdmin - то DATETIME просто удобнее. Помимо этого, можно всякие операции с датами делать средствами MySQL в запросах. Кроме того, нету ограничения 01.01.1970, 0:00:00 ... 19.01.2038, 07:14:07 - это бывает нужно. Да и вдруг конец света не настанет и сайт доработает до 2038-го? Придётся всё переделывать ))
я ж тебе дал ответ =) остальное ручками Код (PHP): function HumanDate($date) { $date = strtotime($date); $diff = time() - $date; if ($diff < 0) { //для прошлого $days = ceil($diff / 86400); } else { //для будущего $days = floor($diff / 86400); } $hd = ''; if ($days == 0) { //сегодня $hd = 'сегодня в ' . date('H:i', $date); } else { if ($days > 0) { //прошлое switch ($days) { case 1: $hd = 'вчера в ' . date('H:i', $date); break; case 2: $hd = 'позавчера в ' . date('H:i', $date); break; } } else { //будущее switch ($days) { case -1: $hd = 'завтра в ' . date('H:i', $date); break; case -2: $hd = 'послезавтра в ' . date('H:i', $date); break; case -3: $hd = 'через три дня'; break; } } } if ($hd == '') { $hd = date('d.m.Y H:i', $date); } return '<acronym title="' . date('d.m.Y H:i', $date) . ', ' . self::$weekdays[date('N', $date)] . '">' . $hd . '</acronym>'; } function HumanDatePrecise($date) { $r = false; $a = preg_split("/[:\.\s-]+/", $date); $d = time() - strtotime($date); if ($d > 0) { if ($d < 3600) { //минут назад switch (floor($d / 60)) { case 0: case 1: return "<acronym title='$date'>только что</acronym>"; break; case 2: return "<acronym title='$date'>только что</acronym>"; break; case 3: return "<acronym title='$date'>три минуты назад</acronym>"; break; case 4: return "<acronym title='$date'>четыре минуты назад</acronym>"; break; case 5: return "<acronym title='$date'>пять минут минуты назад</acronym>"; break; default: return "<acronym title='$date'>" . floor($d / 60) . ' мин. назад</acronym>'; break; }; } elseif ($d < 18000) { //часов назад switch (floor($d / 3600)) { case 1: return "<acronym title='$date'>час назад</acronym>"; break; case 2: return "<acronym title='$date'>два часа назад</acronym>"; break; case 3: return "<acronym title='$date'>три часа назад</acronym>"; break; case 4: return "<acronym title='$date'>четыре часа назад</acronym>"; break; }; } elseif ($d < 172800) { //сегодня //2011-07-14 16:20:44 // 0 1 2 3 4 5 if (date('d') == $a[2]) { return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>"; } if (date('d', time() - 86400) == $a[2]) { return "<acronym title='$date'>вчера в {$a[3]}:{$a[4]}</acronym>"; } if (date('d', time() - 172800) == $a[2]) { return "<acronym title='$date'>позавчера в {$a[3]}:{$a[4]}</acronym>"; } } } else { //////////////////////////////////////////////////////////////////////////////////////// // В будущем <editor-fold defaultstate="collapsed" desc="В будущем"> $d *= - 1; if ($d < 3600) { //минут назад switch (floor($d / 60)) { case 0: case 1: return "<acronym title='$date'>сейчас</acronym>"; break; case 2: return "<acronym title='$date'>через две минуты</acronym>"; break; case 3: return "<acronym title='$date'>через три минуты</acronym>"; break; case 4: return "<acronym title='$date'>через четыре минуты</acronym>"; break; case 5: return "<acronym title='$date'>через пять минут</acronym>"; break; default: return "<acronym title='$date'>через " . floor($d / 60) . ' мин.</acronym>'; break; }; } elseif ($d < 18000) { //часов назад switch (floor($d / 3600)) { case 1: return "<acronym title='$date'>через час</acronym>"; break; case 2: return "<acronym title='$date'>через два часа</acronym>"; break; case 3: return "<acronym title='$date'>через три часа</acronym>"; break; case 4: return "<acronym title='$date'>через четыре часа</acronym>"; break; }; } elseif ($d < 172800) { //сегодня //2011-07-14 16:20:44 // 0 1 2 3 4 5 if (date('d') == $a[2]) { return "<acronym title='$date'>сегодня в {$a[3]}:{$a[4]}</acronym>"; } if (date('d', time() - 86400) == $a[2]) { return "<acronym title='$date'>завтра в {$a[3]}:{$a[4]}</acronym>"; } if (date('d', time() - 172800) == $a[2]) { return "<acronym title='$date'>послезавтра в {$a[3]}:{$a[4]}</acronym>"; } } $d *= - 1; //, В будущем </editor-fold> ////////////////////////////////////////////////////////////////////////////////////////. } $r = "{$a[2]}.{$a[1]}"; if ($a[0] != date('Y') OR $d > 0) { $r .= '.' . $a[0]; } $r .= " {$a[3]}:{$a[4]}"; $date.= ', ' . self::$weekdays[(int) date('N', strtotime($date))]; return "<acronym title='$date'>$r</acronym>"; }
sobachnik, давай не отрываться от темы. Да в MySql есть удобное представление — для работы с датой внутри запросов MySql. Но, цитирую диалог: так вот, если вычисления делать в PHP, то майсиквельный тип "дата" не дает ничего кроме лишней конвертации. Добавлено спустя 4 минуты 41 секунду: Кстати, таймстамп не накладывает ограничений на диапазон дат. Допустимы отрицательные значения, а максимальное значение зависит от платформы. Уж точно до 2038года нынешние 32битные компы не доживут.
Вот небольшой скрипт реализующий это. Правда здесь формат на русском языке (дней/минут/недель назад), но переделать не составит труда.
В пхп есть нативные механизмы вычисления разницы между датами и занимает это две-три строки. Сам только недавно заметил. =) http://php.ru/manual/datetime.diff.html