WordPress как на ладони

human_time_diff()WP 1.5.0

Определяет разницу между двумя переданными метками времени и возвращает результат в формате удобном для чтения: 1 минута, 5 часов, 10 дней, 3 месяца, 1 год (1 min, 5 hours, 10 days). Относительные даты.

Функции передается время в формате timestamp (метка времени Unix). Такую метку можно получить с помощью функций: current_time('timestamp'), get_post_time('U') и других функций времени.

1 раз — 0.00003 сек (очень быстро) | 50000 раз — 0.12 сек (очень быстро) | PHP 7.4.8, WP 5.6.1
Хуки из функции

Возвращает

Строку. Человеко-понятную разницу времени.

Использование

human_time_diff( $from, $to );
$from(число) (обязательный)
Метка времени Unix - время с которого будет считаться разница. Это может быть дата записи: get_post_time('U').
$to(число)
Метка времени Unix - время до которого будет считаться разница.
По умолчанию: 0 - time()

Примеры

0

#1 Прошло времени с момента публикации записи

Этот пример показывает как вывести время, которое прошло с момента публикации записи. Используется в Цикле WordPress:

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

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

Другими словами, в human_time_diff() нужно указывать время в одном часовом поясе.

0

#2 Времена в стандарте GMT:

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

Здесь get_post_time( 'U', true ), выведет значение поля записи post_date_gmt, а не post_date. А второй параметр мы не указали потому что time() по умолчанию получает gmt время.

0

#3 Прошло времени с момента публикации комментария

Этот пример аналогичный предыдущему, только для комментариев:

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

#4 Ограничение работы функции до ближайшего месяца

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

$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 назад.";
0

#5 Секунды в человеческом формате

Допустим нам надо превратить (конвертировать) секунды в понятный формат:

echo human_time_diff( 0, 600 );    // 10 min
echo human_time_diff( 0, 6000 );   // 2 hour
echo human_time_diff( 0, 60000 );  // 17 hour
echo human_time_diff( 0, 600000 ); // 7 day

Список изменений

С версии 1.5.0 Введена.
С версии 5.3.0 Added support for showing a difference in seconds.

Код human_time_diff() WP 6.5.2

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;
		}
		/* translators: Time difference between two dates, in seconds. %s: Number of seconds. */
		$since = sprintf( _n( '%s second', '%s seconds', $secs ), $secs );
	} elseif ( $diff < HOUR_IN_SECONDS && $diff >= MINUTE_IN_SECONDS ) {
		$mins = round( $diff / MINUTE_IN_SECONDS );
		if ( $mins <= 1 ) {
			$mins = 1;
		}
		/* translators: Time difference between two dates, in minutes (min=minute). %s: Number of minutes. */
		$since = sprintf( _n( '%s min', '%s mins', $mins ), $mins );
	} elseif ( $diff < DAY_IN_SECONDS && $diff >= HOUR_IN_SECONDS ) {
		$hours = round( $diff / HOUR_IN_SECONDS );
		if ( $hours <= 1 ) {
			$hours = 1;
		}
		/* translators: Time difference between two dates, in hours. %s: Number of hours. */
		$since = sprintf( _n( '%s hour', '%s hours', $hours ), $hours );
	} elseif ( $diff < WEEK_IN_SECONDS && $diff >= DAY_IN_SECONDS ) {
		$days = round( $diff / DAY_IN_SECONDS );
		if ( $days <= 1 ) {
			$days = 1;
		}
		/* translators: Time difference between two dates, in days. %s: Number of days. */
		$since = sprintf( _n( '%s day', '%s days', $days ), $days );
	} elseif ( $diff < MONTH_IN_SECONDS && $diff >= WEEK_IN_SECONDS ) {
		$weeks = round( $diff / WEEK_IN_SECONDS );
		if ( $weeks <= 1 ) {
			$weeks = 1;
		}
		/* translators: Time difference between two dates, in weeks. %s: Number of weeks. */
		$since = sprintf( _n( '%s week', '%s weeks', $weeks ), $weeks );
	} elseif ( $diff < YEAR_IN_SECONDS && $diff >= MONTH_IN_SECONDS ) {
		$months = round( $diff / MONTH_IN_SECONDS );
		if ( $months <= 1 ) {
			$months = 1;
		}
		/* translators: Time difference between two dates, in months. %s: Number of months. */
		$since = sprintf( _n( '%s month', '%s months', $months ), $months );
	} elseif ( $diff >= YEAR_IN_SECONDS ) {
		$years = round( $diff / YEAR_IN_SECONDS );
		if ( $years <= 1 ) {
			$years = 1;
		}
		/* translators: Time difference between two dates, in years. %s: Number of years. */
		$since = sprintf( _n( '%s year', '%s years', $years ), $years );
	}

	/**
	 * Filters the human-readable difference between two timestamps.
	 *
	 * @since 4.0.0
	 *
	 * @param string $since The difference in human-readable text.
	 * @param int    $diff  The difference in seconds.
	 * @param int    $from  Unix timestamp from which the difference begins.
	 * @param int    $to    Unix timestamp to end the time difference.
	 */
	return apply_filters( 'human_time_diff', $since, $diff, $from, $to );
}
1 комментарий
    Войти