Получает локализованную дату (переведенную на текущий язык) из переданной метки времени 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; }