Поэтому в основном я сейчас выбираю временную метку из моей базы данных MySQL. В базе данных временная метка выглядит так:
2010-06-30 12:36:08
Очевидно, что для webapp это не очень привлекательно для просмотра пользователями. Итак, используя некоторые функции CodeIgniter, я сделал это немного лучше.
<h4 class="timestamp"> <?php // Quickly calculate the timespan $post_date = mysql_to_unix($row->date); $now = time(); echo timespan($post_date, $now);?> ago </h4>
Если вы не выполняете CodeIgniter, все стандартные PHP, кроме echo timespan()
. CodeIgniter просто повторяет это как «английский». Итак, пример вывода:
2 Months, 4 Weeks, 5 Hours, 20 Minutes ago
Это все хорошо и хорошо, но я хочу, чтобы все выглядело приятнее … слишком много запятых, и все это слишком долго (я знаю, я придирчив …). Я бы хотел :
7 hours, 33 minutes ago
4 days ago
2 weeks, 6 days ago
4 months ago
Over a year ago
Как вы можете видеть, в настоящее время я использую функцию CodeIgniter, чтобы упростить это, но если есть какая-то собственная функция PHP, которая может делать то, что я хочу, это будет потрясающе.
Спасибо за вашу помощь!
разъем
Это лучше всего сделать на стороне клиента на уровне презентации. Вот решение JS:
Timeago – это плагин jQuery, который упрощает поддержку автоматического обновления нечетких временных меток (например, «4 минуты назад» или «около 1 дня назад»).
Timeago превратит все элементы abbr в class
timeago и временную метку ISO 8601 в title
:
<abbr class="timeago" title="2008-07-17T09:24:17Z">July 17, 2008</abbr>
в нечто подобное:
<abbr class="timeago" title="July 17, 2008">about a year ago</abbr>
Чтобы преобразовать дату в формат ISO 8601, вы можете сделать что-то вроде этого:
<?= date("c", $post_date) ?>
Примеры:
Вы открыли эту страницу меньше минуты назад. (Это будет обновляться каждую минуту. Подождите.)
Последнее изменение этой страницы: 11:47, 6 апреля 2010.
Райан родился 31 год назад.
$ts = new DateTime(); $ts->setTimestamp($my_timestamp); $cur = new DateTime(); $difference = $cur->diff($ts); if ($difference->format("%a") == 0) $out = $difference->format("%h hours %i minutes"); elseif ($difference->format("%a") < 7) $out = $difference->format("%a days"); elseif ($difference->format("%m") == 0) { $days = $difference->format("%a"); $out = sprintf("%d weeks %d days", floor($days / 7), $days % 7); } elseif ($difference->format("%y") == 0) $out = $difference->format("%m months"); else $out = "over a year";
Вам нужно будет внести несколько корректировок, если вы не хотите, чтобы такие вещи, как «1 день».