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 );
}
Эта функция принимает два временных индекса и возвращает разницу в читабельном формате. Убедитесь, что вы используете временные метки в одной временной зоне для корректной работы.