Хак functions.php (время, отображаемое возле поста)

2.05K
.
ДоХтор

Данный код заменяет время, отображаемое возле поста.
Например, было так:
(Сегодня, 23:20)
Станет так:
(2 секунды назад)
или
(59 секунд назад)
или
(4 минуты назад)
или
(41 минуту назад)
или
(11 дней назад)
или
(11 месяцев назад)
и т.д.

Если пост был написан более 12-и месяцев назад, то будет выведена дата и время этого поста (т.е., как есть)

display_date (+/-)
public static function display_date($var)
{
    $pl = function ($int, $arr) {        
        if ($int > 10 && $int < 15) {
            $out = ' '. $arr[2];
        } else {
            if (($int % 10) == 1) {
                $out = ' '. $arr[0];
            } elseif (($int % 10) > 1 && ($int % 10) < 5) {
                $out = ' '. $arr[1];
            } else {
                $out = ' '. $arr[2];
            }
        }

        return $int . $out;
    };
    
    $label = time() - $var;
    
    $w = 'секунд';
    $arrSec = [$w .'у', $w .'ы', $w];
    $w = 'минут';
    $arrMin = [$w .'у', $w .'ы', $w];
    $w = 'час';
    $arrHour = [$w, $w .'а', $w .'ов'];
    $w = 'дн';
    $arrDays = ['день', $w .'я', $w .'ей'];
    $w = 'месяц';
    $arrMonths = [$w, $w .'а', $w .'ев'];
    $back = ' назад';
    
    if ($label == 0) {
        $out = 'только что';
    } elseif ($label < 60) {
        $out = $pl($label, $arrSec) . $back;
    } elseif ($label < 3600) {
        $out = $pl(intval($label / 60), $arrMin) . $back;
    } elseif ($label < (3600 * 24)) {
        $out = $pl(intval($label / 3600), $arrHour) . $back;
    } elseif ($label < (3600 * 24 * date('t'))) {
        $out = $pl(intval($label / (3600 * 24)), $arrDays) . $back;
    } elseif ($label < (3600 * 24 * (date('L') + 365))) {
        $out = $pl(intval($label / (3600 * 24 * 30)), $arrMonths) . $back;
    } else {
        $shift = (self::$system_set['timeshift'] 
            + self::$user_set['timeshift']) * 3600;
        $out = date('d.m.Y / H:i', $var + $shift);
    }
    
    return $out;
}
.
aNNiMON

Вариант плюрализации покороче (более универсальный):

pluralForm (+/-)
public static function pluralForm($n, array $forms) {
    if ( ($n % 10 == 1) && ($n % 100 != 11) )
        return $forms[0];
    if ( ($n % 10 >= 2) && ($n % 10 <= 4) &&
        (($n % 100 < 10) || ($n % 100 >= 20)) )
        return $forms[1];
    return $forms[2];
}

Вот ещё вариант, правда, для тройки, но подпилить можно:
textual_date, автор XakepPRO (+/-)
function textual_date($time, $format = 'j.m.Y / H:i', $with_offset = true)
{
    global $realtime, $set_user;
    $server_time = $with_offset ? $realtime + $set_user['sdvig'] * 3600 : $realtime;
    $user_time   = $with_offset ? $time     + $set_user['sdvig'] * 3600 : $time;

    switch (date('jmy', $user_time)) {
        case date('jmy', $server_time):
            return 'Сегодня, ' . date('H:i', $user_time);
        case date('jmy', $server_time - 86400):
            return 'Вчера, ' . date('H:i', $user_time);
        case date('jmy', $server_time - 172800):
            return 'Позавчера, ' . date('H:i', $user_time);
        default: return date($format, $user_time);
    }
}

Показывает, дату в виде:
Сегодня, 23:00
Вчера, 12:20
Позавчера: 13:30
Для более ранних дат будет выдан обычный формат.
.

Если написано сообщение, например, только что, то покажет 0 секунд назад?

.
ДоХтор
# intelligent (01.12.2016 / 01:40)
Если написано сообщение, например, только что, то покажет 0 секунд назад?
Теоретически да. Но на практике наверное нельзя воссоздать подобную ситуацию. Я на локалке когда тестировал код, то на изменение значения и обновление страницы я тратил не меньше 2-х секунд. Может быть у кого-то получится добиться нуля
.
__________________________________________________
# intelligent (01.12.2016 / 01:40)
Если написано сообщение, например, только что, то покажет 0 секунд назад?
Ну уж если как вариант кто то к примеру и угадает на это число то добавить к этому числу одну секунду не убудет ни где гг)
.

intelligent, или же можно добавить к условию ещё одно ветвление примерно такого вида :

if ($label == 0) {
    echo 'только что';
}
.
# intelligent (01.12.2016 / 01:40)
Если написано сообщение, например, только что, то покажет 0 секунд назад?
Только что исправил код, т.к. действительно было 0 сек назад.
.

ДоХтор, А как тебе такой фокус. Это Табор

Прикрепленные файлы:
.
# Pistolero (02.12.2016 / 00:51)
ДоХтор, А как тебе такой фокус. Это Табор
временной сдвиг наверное забыли учесть
.
# Pistolero (02.12.2016 / 00:51)
ДоХтор, А как тебе такой фокус. Это Табор
Норм, чо Я изобрёл машину времени ))
Всего: 40