WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

date_i18n() WP 0.71

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

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

i18n - это сокращенное слово I{nternationalizatio}n (18 букв между первой и последней буквой).

Работает на основе: wp_date()
Хуки из функции
Возвращает

Строку. Локализованную дату.

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

date_i18n( $format, $timestamp_with_offset, $gmt );
$format(строка) (обязательный)
Формат в котором выводить дату, пример: F j, Y - Ноябрь 6, 2010. Полный список форматов.
$timestamp_with_offset(число)
Метка времени Unix. По умолчанию используется текущая метка time() (если $gmt=true) или current_time('timestamp') (если $gmt=false).
По умолчанию: false
$gmt(логический)

Нужно ли использовать GMT зону.

  • true - устанавливать часовой пояс равный времени по Гринвичу (‎UTC+0).
  • false - устанавливать часовой пояс по настройкам сайта.

Работает только если не указать $unixtimestamp, что логично, потому что если мы указываем метку времени, то скрипт не может угадать какая там временная зона и на сколько нужно её сдвинуть чтобы получить нужный результат. $gmt нужен, когда метка времени не указывается (ставится false) и берется текущее время...

По умолчанию: false

Примеры

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

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

// текущее время
echo date_i18n( 'j F Y H:i:s', false );       // 12 августа 2018 02:08:59
echo date_i18n( 'j F Y H:i:s', false, true ); // 11 августа 2018 21:08:59 - GMT работает, потому что время не указано

// указанное время
echo date_i18n( 'j M Y H:i:s', strtotime( '1999-11-15' ) );    // 15 Ноя 1999 00:11:00
echo date_i18n( 'j M Y H:i:s', strtotime( '1999-11-15' ), 1 ); // 15 Ноя 1999 00:11:00 - GMT не работает, потому что указана метка времени

Заметки

  • Global. WP_Locale. $wp_locale WordPress date and time locale object.

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

С версии 0.71 Введена.
С версии 5.3.0 Converted into a wrapper for wp_date().

Код date i18n: wp-includes/functions.php WP 5.4.2

<?php
function date_i18n( $format, $timestamp_with_offset = false, $gmt = false ) {
	$timestamp = $timestamp_with_offset;

	// If timestamp is omitted it should be current time (summed with offset, unless `$gmt` is true).
	if ( ! is_numeric( $timestamp ) ) {
		$timestamp = current_time( 'timestamp', $gmt );
	}

	/*
	 * This is a legacy implementation quirk that the returned timestamp is also with offset.
	 * Ideally this function should never be used to produce a timestamp.
	 */
	if ( 'U' === $format ) {
		$date = $timestamp;
	} elseif ( $gmt && false === $timestamp_with_offset ) { // Current time in UTC.
		$date = wp_date( $format, null, new DateTimeZone( 'UTC' ) );
	} elseif ( false === $timestamp_with_offset ) { // Current time in site's timezone.
		$date = wp_date( $format );
	} else {
		/*
		 * Timestamp with offset is typically produced by a UTC `strtotime()` call on an input without timezone.
		 * This is the best attempt to reverse that operation into a local time to use.
		 */
		$local_time = gmdate( 'Y-m-d H:i:s', $timestamp );
		$timezone   = wp_timezone();
		$datetime   = date_create( $local_time, $timezone );
		$date       = wp_date( $format, $datetime->getTimestamp(), $timezone );
	}

	/**
	 * Filters the date formatted based on the locale.
	 *
	 * @since 2.8.0
	 *
	 * @param string $date      Formatted date string.
	 * @param string $format    Format to display the date.
	 * @param int    $timestamp A sum of Unix timestamp and timezone offset in seconds.
	 *                          Might be without offset if input omitted timestamp but requested GMT.
	 * @param bool   $gmt       Whether to use GMT timezone. Only applies if timestamp was not provided.
	 *                          Default false.
	 */
	$date = apply_filters( 'date_i18n', $date, $format, $timestamp, $gmt );

	return $date;
}

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

Из метки: date time (дата время)

Еще из метки: localize (l10n i18n локализация Internationalization)

Еще из раздела: Локализация

8 комментов
  • Артём

    Не совсем понял, если timestamp у меня в UTC, как вывести местное время?

    Ответить5 лет назад #
    • Kama7770

      Передайте его в date_i18n() и получите локальное время автоматом. Смотрите параметр $gtm.

      Ответить5 лет назад #
  • Георгий

    А подскажите, можно ли склонять месяцы?
    Если я хочу получить "25 сентября", а не "25 сентябрь".
    Спасибо

    Ответить4.6 года назад #
    • Kama7770

      Да, но для этого нужно добавить хак: вот такой код в файл functions.php:

      add_filter('date_i18n', 'russify_months', 11, 2 );
      
      /**
       * Русифицирует месяца и недели в дате.
       * Функция для фильтра date_i18n.
       * @param строка $date       Дата в принятом формате
       * @param строка $req_format Формат передаваемой даты
       * @return Дату   в русском формате
       */
      function russify_months( $date, $req_format ){
      	// в формате есть "строковые" неделя или месяц
      	if( ! preg_match('/[FMlS]/', $req_format ) )
      		return $date;
      
      	$replace = array ( 
      		'Январь'=>'января', 'Февраль'=>'февраля', 'Март'=>'марта', 'Апрель'=>'апреля', 'Май'=>'мая', 'Июнь'=>'июня', 'Июль'=>'июля', 'Август'=>'августа', 'Сентябрь'=>'сентября', 'Октябрь'=>'октября', 'Ноябрь'=>'ноября', 'Декабрь'=>'декабря',
      
      		'Янв'=>'янв.', 'Фев'=>'фев.', 'Мар'=>'март', 'Апр'=>'апр.', 'Май'=>'май', 'Июн'=>'июнь', 'Июл'=>'июль', 'Авг'=>'авг.', 'Сен'=>'сен.', 'Окт'=>'окт.', 'Ноя'=>'ноя.', 'Дек'=>'дек.',
      
      		'January'=>'января', 'February'=>'февраля', 'March'=>'марта', 'April'=>'апреля', 'May'=>'мая', 'June'=>'июня', 'July'=>'июля', 'August'=>'августа', 'September'=>'сентября', 'October'=>'октября', 'November'=>'ноября', 'December'=>'декабря', 
      
      		'Jan'=>'янв.', 'Feb'=>'фев.', 'Mar'=>'март.', 'Apr'=>'апр.', 'May'=>'мая', 'Jun'=>'июня', 'Jul'=>'июля', 'Aug'=>'авг.', 'Sep'=>'сен.', 'Oct'=>'окт.', 'Nov'=>'нояб.', 'Dec'=>'дек.',    
      
      		'Sunday'=>'воскресенье', 'Monday'=>'понедельник', 'Tuesday'=>'вторник', 'Wednesday'=>'среда', 'Thursday'=>'четверг', 'Friday'=>'пятница', 'Saturday'=>'суббота',
      
      		'Sun'=>'вос.', 'Mon'=>'пон.', 'Tue'=>'вт.', 'Wed'=>'ср.', 'Thu'=>'чет.', 'Fri'=>'пят.', 'Sat'=>'суб.', 'th'=>'', 'st'=>'', 'nd'=>'', 'rd'=>'',      
      	);
      	$date = strtr( $date, $replace );
      
      	//if( function_exists('mb_strtolower') ) $date = mb_strtolower( $date );
      
      	return $date;
      }
      
      5
      Ответить4.6 года назад #
  • Артём

    Скажите пожалуйста, почему независимо от значения параметра $gmt у меня всегда показывает время в GMT?

    <?php
    	$next_run = wp_next_scheduled(self::PREFIX . '_schedule_hook');
    ?>
    
    <p>Следующий запуск: <?php echo date_i18n('j F Y в H:i:s', $next_run, false) . ' (' . date_i18n('H:i:s', $next_run, true) . ' GMT)'; ?></p>

    Следующий запуск: 7 июля 2017 в 20:42:32 (20:42:32 GMT)

    Часовой пояс на сервере и в настройках WordPress стоит UTC+3.

    Ответить3 года назад #
    • @ an0maly homeless.su

      В настройках пэхи часовой пояс верный? ну или в начале скрипта явно указать, например, для москоу:
      date_default_timezone_set('Europe/Moscow');
      ПС. Пардон за некропост, не рассмотрел сходу дату))

      Ответить2.2 года назад #
    • Kama7770

      Дописал к параметру $gmt

      Работает только если не указать $unixtimestamp, что логично, потому что если мы указываем метку времени, то скрипт не может угадать какая там временная зона и на сколько нужно её сдвинуть чтобы получить нужный результат.

      Т.е. ты жестко указываешь метку времени, а значит от нее и пляши... $gmt нужен когда метка времени не указывается и берется текущее время...

      Ответить2.1 года назад #