Функция HUMAN_TIME_DIFF() в PHP для определения разницы времени до текущего момента.

HUMAN_TIME_DIFF() │ WP 1.5.0

Функция HUMAN_TIME_DIFF() определяет разницу между двумя временными метками и возвращает ее в понятном формате, как, например, "1 час", "5 минут", "2 дня".

  • Время выполнения: 1 раз — 0.00003 сек (очень быстро) | 50000 раз — 0.12 сек (очень быстро) | PHP 7.4.8, WP 5.6.1

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Строка. Разница во времени, представленная в читаемом формате.

ИСПОЛЬЗОВАНИЕ

Функция вызывается следующим образом:

human_time_diff( $from, $to );

Где:

  • $from (int) (обязательный) — Unix-метка времени, с которой начинается отсчет.
  • $to (int) — Unix-метка времени, до которой считается разница. По умолчанию используется текущее время time(), если не указано.

ПРИМЕРЫ

Пример 1: Секунды в человекочитаемом формате

Предположим, мы хотим преобразовать секунды в понятный формат:

echo human_time_diff( 0, 600 );    // 10 мин
echo human_time_diff( 0, 6000 );   // 2 часа
echo human_time_diff( 0, 60000 );  // 17 часов
echo human_time_diff( 0, 600000 ); // 7 дней

Пример 2: Отображение времени, прошедшего с момента публикации поста

Если прошло время с публикации поста, можно отобразить этот временной интервал. Обычно это делается в цикле WordPress:

$time_diff = human_time_diff( get_post_time('U'), current_time('timestamp') );
echo "Опубликовано $time_diff назад.";

Здесь мы указали второй параметр current_time('timestamp'), чтобы передать метку времени в той же временной зоне, что и get_the_time(). Временная зона указывается в настройках WordPress. Если второй параметр не указан, используется стандартная функция PHP time(), которая получает время в стандартной зоне GMT, что может привести к неправильному результату.

Важно: в human_time_diff() вы должны указывать время в одной временной зоне.

Пример 3: Время в стандарте GMT

Если нужно отобразить разницу во времени с использованием GMT:

$human_time = human_time_diff( get_post_time( 'U', true ) );
echo "Опубликовано $human_time назад.";

В данном случае get_post_time('U', true) вернет значение поля post_date_gmt, а второй параметр не указан, так как time() по умолчанию получает GMT-время.

Пример 4: Время добавления комментария в формате разницы до текущего времени

Чтобы показать разницу времени с момента добавления комментария:

$time_diff = human_time_diff( get_comment_time('U'), current_time('timestamp') );
echo "Опубликовано $time_diff назад.";

Пример 5: Ограничение функции на следующий месяц

По умолчанию human_time_diff() выводит разницу в месяцах и годах. Ограничим разницу до месяца; если она больше, отобразим дату в привычном формате:

$time_diff = human_time_diff( get_comment_time('U'), current_time('timestamp') );

if( preg_match('~month|year~iu', $time_diff ) ){
    echo "Опубликовано: ". get_the_time();
} else {
    echo "Опубликовано $time_diff назад.";
}

Пример 6: Получение времени публикации и последнего изменения поста

$lastmodified = get_the_modified_time('U');
$posted = get_the_time('U');

echo sprintf( "Опубликовано %s назад", human_time_diff( $posted, current_time( 'U' ) ) );
echo "
"; if ( $lastmodified > $posted ) { echo sprintf( "Изменено %s назад", human_time_diff( $lastmodified, current_time('U') ) ); }

Пример 7: Локализация результата

Для локализации результата можно использовать следующий код:

printf( _x( '%s назад', 'читаемая разница во времени', 'my_textdomain' ),
    human_time_diff( get_the_time( 'U' ) )
);

ИЗМЕНЕНИЯ

  • С версии 1.5.0 — впервые представлена функция.
  • С версии 5.3.0 — добавлена поддержка отображения разницы в секундах.

КОД ФУНКЦИИ HUMAN_TIME_DIFF

function human_time_diff( $from, $to = 0 ) {
    if ( empty( $to ) ) {
        $to = time();
    }

    $diff = (int) abs( $to - $from );

    if ( $diff < MINUTE_IN_SECONDS ) {
        $secs = $diff;
        if ( $secs <= 1 ) {
            $secs = 1;
        }
        $since = sprintf( _n( '%s секунда', '%s секунды', $secs ), $secs );
    } elseif ( $diff < HOUR_IN_SECONDS && $diff >= MINUTE_IN_SECONDS ) {
        $mins = round( $diff / MINUTE_IN_SECONDS );
        if ( $mins <= 1 ) {
            $mins = 1;
        }
        $since = sprintf( _n( '%s минута', '%s минуты', $mins ), $mins );
    } elseif ( $diff < DAY_IN_SECONDS && $diff >= HOUR_IN_SECONDS ) {
        $hours = round( $diff / HOUR_IN_SECONDS );
        if ( $hours <= 1 ) {
            $hours = 1;
        }
        $since = sprintf( _n( '%s час', '%s часа', $hours ), $hours );
    } elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) {
        $days = round( $diff / DAY_IN_SECONDS );
        if ( $days <= 1 ) {
            $days = 1;
        }
        $since = sprintf( _n( '%s день', '%s дня', $days ), $days );
    } elseif ( $diff < MONTH_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) {
        $weeks = round( $diff / WEEK_IN_SECONDS );
        if ( $weeks <= 1 ) {
            $weeks = 1;
        }
        $since = sprintf( _n( '%s неделя', '%s недели', $weeks ), $weeks );
    } elseif ( $diff < YEAR_IN_SECONDS && $diff >= MONTH_IN_SECONDS ) {
        $months = round( $diff / MONTH_IN_SECONDS );
        if ( $months <= 1 ) {
            $months = 1;
        }
        $since = sprintf( _n( '%s месяц', '%s месяца', $months ), $months );
    } elseif ( $diff >= YEAR_IN_SECONDS ) {
        $years = round( $diff / YEAR_IN_SECONDS );
        if ( $years <= 1 ) {
            $years = 1;
        }
        $since = sprintf( _n( '%s год', '%s года', $years ), $years );
    }

    return apply_filters( 'human_time_diff', $since, $diff, $from, $to );
}

Эта функция принимает два временных индекса и возвращает разницу в читабельном формате. Убедитесь, что вы используете временные метки в одной временной зоне для корректной работы.

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *