Вывод даты и времени как в Twitter или Facebook

Как известно, в Twitter и Facebook даты сообщений проставляются не стандартно, а показывают сколько прошло времени с момента публикации: «30 секунд назад» или «2 часа назад». Сегодня я покажу как это можно реализовать у себя с помощью PHP.

Для пользователей WordPress все совсем просто, вставьте этот код в место вывода даты:

<?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' назад'; ?>

Для других случаев используйте этот код:

function showDate($date) // $date --> время в формате Unix time
{
    $stf = 0;
    $cur_time = time();
    $diff = $cur_time - $date;

    $seconds = array('секунда', 'секунды', 'секунд');
    $minutes = array('минута', 'минуты', 'минут');
    $hours = array('час', 'часа', 'часов');
    $days = array('день', 'дня', 'дней');
    $weeks = array('неделя', 'недели', 'недель');
    $months = array('месяц', 'месяца', 'месяцев');
    $years = array('год', 'года', 'лет');
    $decades = array('десятилетие', 'десятилетия', 'десятилетий');

    $phrase = array($seconds, $minutes, $hours, $days, $weeks, $months, $years, $decades);
    $length = array(1, 60, 3600, 86400, 604800, 2630880, 31570560, 315705600);

    for ($i = sizeof($length) - 1; ($i >= 0) && (($no = $diff / $length[$i]) <= 1); $i--) ;
    if ($i < 0) $i = 0;
    $_time = $cur_time - ($diff % $length[$i]);
    $no = floor($no);
    $value = sprintf("%d %s ", $no, getPhrase($no, $phrase[$i]));

    if (($stf == 1) && ($i >= 1) && (($cur_time - $_time) > 0)) $value .= time_ago($_time);

    return $value . ' назад';
}
function getPhrase($number, $titles)
{
    $cases = array (2, 0, 1, 1, 1, 2);
    return $titles[ ($number%100>4 && $number%100<20)? 2 : $cases[min($number%10, 5)] ];
}

Enjoy!

Метки: , , , , ,

Комментарии

  1. art 07.11.2011 в 16:33 #

    если так выводить, то и обновлять значения надо. на js не должно быть сложно

    • Neolot 07.11.2011 в 16:36 #

      Это имеет смысл, если только ваш сайт обновляется с частотой твиттера :) Поищите, подобное решение на js легко найти

      • art 07.11.2011 в 16:40 #

        нет, это имеет смысл всегда, если написано «опубликовано x секунд/минут/часов назад» и пока я сижу на сайте, это значение не должно остаться прежним.

        это не от часто ты публикаций зависит, а от самой сути подобного вывода времени.

        да и че искать, надо будет, сам напишу

  2. Allpa 10.11.2011 в 21:40 #

    Это имеет смысл, если только ваш сайт обновляется с частотой твиттера

    А с какой частотой этот код обновляет данные? У меня получилось (что, в общем-то, странно) заюзать Ваш код. Последний твит выводится в «шапке». Так я вижу отправленный 2 часа назад, отправленный только что — не вижу :)

    Так с какой-какой частотой?

    • Neolot 10.11.2011 в 21:55 #

      С частотой обновления страницы.

      • Allpa 10.11.2011 в 22:11 #

        В том-то и дело что нет...

        Можно я Вам тут скопирую код, который был в шаблоне и как я его заменила на Ваш? Одной мне не справиться...

        • Neolot 10.11.2011 в 22:20 #

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

          • Allpa 10.11.2011 в 22:42 #

            Да нет, время-то оно как раз считает, только показывает не самый последний твит.

          • Neolot 10.11.2011 в 22:58 #

            Этот код никак не связан с вашими твитами, поверьте, он просто считает разницу во времени и ничего более.

  3. Allpa 10.11.2011 в 22:14 #

    Понимаете, есть два варианта замены: или оно мне выводит последний твит как отправленный 4 десятилетия назад :) или не обновляет данные после перезагрузки страницы.

    Такие дела...

  4. Allpa 10.11.2011 в 23:19 #

    Этот код никак не связан с вашими твитами, поверьте, он просто считает разницу во времени и ничего более

    Да, я таки додумалась до этого :) Поняла, что где-то есть указание, с какой частотой менять твиты и Ваш прекрасный код тут ни при чём.

    Спасибо за помощь: теперь минуты, часы и дни нормально отображаются.

  5. blogaster 08.12.2011 в 00:36 #

    Отличная вещь! Как раз пригодилась

Ваше мнение

Если вам нужно вставить код, оберните его в специальный шорткод [php], [html], [css], [js].
Например: [js]Ваш код[/js]