wp_date() WP 5.3.0

Click here to view original web page at wp-kama.ru

Получает локализованную дату (переведенную на текущий язык) из переданной метки времени unix. Локализация PHP функции date().

Если в выводимой дате используется формат с месяцем или неделей в виде строки, то функция попытается перевести их на текущий язык. В остальных случаях - это аналог date() в PHP.

Это новая функция (введенная в версии 5.3), которая должна полностью заменить функцию date_i18n().

Заметка: этой функции, в отличии от date_i18n(), нужно передавать "реальную" метку времени Unix (метку в UTC/GMT формате, без добавления к ней сдвижки временной зоны). Сдвижка временной зоны добавляется автоматически внутри функции на основе третьего параметра $timezone.

Указать произвольную сдвижку временной зоны можно в третьем параметре $timezone.

В связи с введением в версии 5.3 нового API для работы со временем.

Не рекомендуется:

  • Не получайте время WP timestamps (число равное метке времени + сдвижка времени сайта):
    • current_time( 'timestamp' )
    • get_post_time( 'U' )
  • Не локализуйте время/дату функцией:
    • date_i18n( DATE_RFC3339, $timestamp + $offset )
  • Не сохраняйте на постоянной основе WP timestamps.
  • Не сравнивайте WP timestamp'ы.
  • Не изменяйте временную зону PHP с помощью функции date_default_timezone_set() (это важное требование для правильной работы ядра).

Рекомендуется

  • Получайте время как Unix timestamp (метка времени Unix без сдвижки) или как объект DateTimeImmutable:
  • Локализуйте время/дату базируясь на Unix timestamp:
  • Сохраняйте Unix timestamps или форматы, которые точно указывают момент времени, например DATE_RFC3339.
  • Сравнивайте метки времени Unix, объекты DateTimeInterface или строковые даты в единой временной зоне.
  • Используйте объекты: DateTimeZone и DateTimeImmutable (с функцией wp_date() для локализации), когда нужно получить время во временной зоне отличной от зоны сайта).
Возвращает

Строку/false. Переведенную дату. False когда введена неправильная метка времени.

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

wp_date( $format, $timestamp, $timezone );

Примеры

#1 Локализация php функции date() в WordPress

Демонстрация работы функции:

// текущее время
echo wp_date( 'j F Y H:i:s' ); // 21 ноября 2019 17:52:15 (учитывается временная зона +5 часов)
echo date( 'j F Y H:i:s' );    // 21 November 2019 12:52:15 (UTC время)

// указанное время
echo wp_date( 'j F Y H:i:s', 0 );  // 1 января 1970 06:00:00

echo wp_date( 'j M Y H:i:s', strtotime('1999-11-15') );                          // 15 Ноя 1999 05:00:00 (учитывается временная зона +5 часов)
echo wp_date( 'j M Y H:i:s', strtotime('1999-11-15'), new DateTimeZone('UTC') ); // 15 Ноя 1999 00:00:00 (UTC время)

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

function wp_date( $format, $timestamp = null, $timezone = null ) {
	global $wp_locale;

	if ( null === $timestamp ) {
		$timestamp = time();
	} elseif ( ! is_numeric( $timestamp ) ) {
		return false;
	}

	if ( ! $timezone ) {
		$timezone = wp_timezone();
	}

	$datetime = date_create( '@' . $timestamp );
	$datetime->setTimezone( $timezone );

	if ( empty( $wp_locale->month ) || empty( $wp_locale->weekday ) ) {
		$date = $datetime->format( $format );
	} else {
		// We need to unpack shorthand `r` format because it has parts that might be localized.
		$format = preg_replace( '/(?<!\\\\)r/', DATE_RFC2822, $format );

		$new_format    = '';
		$format_length = strlen( $format );
		$month         = $wp_locale->get_month( $datetime->format( 'm' ) );
		$weekday       = $wp_locale->get_weekday( $datetime->format( 'w' ) );

		for ( $i = 0; $i < $format_length; $i ++ ) {
			switch ( $format[ $i ] ) {
				case 'D':
					$new_format .= addcslashes( $wp_locale->get_weekday_abbrev( $weekday ), '\\A..Za..z' );
					break;
				case 'F':
					$new_format .= addcslashes( $month, '\\A..Za..z' );
					break;
				case 'l':
					$new_format .= addcslashes( $weekday, '\\A..Za..z' );
					break;
				case 'M':
					$new_format .= addcslashes( $wp_locale->get_month_abbrev( $month ), '\\A..Za..z' );
					break;
				case 'a':
					$new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'a' ) ), '\\A..Za..z' );
					break;
				case 'A':
					$new_format .= addcslashes( $wp_locale->get_meridiem( $datetime->format( 'A' ) ), '\\A..Za..z' );
					break;
				case '\\':
					$new_format .= $format[ $i ];

					// If character follows a slash, we add it without translating.
					if ( $i < $format_length ) {
						$new_format .= $format[ ++$i ];
					}
					break;
				default:
					$new_format .= $format[ $i ];
					break;
			}
		}

		$date = $datetime->format( $new_format );
		$date = wp_maybe_decline_date( $date );
	}

	/**
	 * Filters the date formatted based on the locale.
	 *
	 * @since 5.3.0
	 *
	 * @param string       $date      Formatted date string.
	 * @param string       $format    Format to display the date.
	 * @param int          $timestamp Unix timestamp.
	 * @param DateTimeZone $timezone  Timezone.
	 *
	 */
	$date = apply_filters( 'wp_date', $date, $format, $timestamp, $timezone );

	return $date;
}

Cвязанные функции