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

date_i18n() WP 0.71

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

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

Является основой для: mysql2date()
Хуки из функции
Возвращает

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

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

date_i18n( $dateformatstring, $unixtimestamp, $gmt );
$dateformatstring(строка) (обязательный)
Формат в котором выводить дату, пример: F j, Y - Ноябрь 6, 2010. Полный список форматов.
$unixtimestamp(число)
Метка времени 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:m:s', false );       // 12 августа 2018 02:08:59
echo date_i18n( 'j F Y H:m:s', false, true ); // 11 августа 2018 21:08:59 - GMT работает, потому что время не указано

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

Заметки

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

Заметки

  • Global. WP_Locale. $wp_locale

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

С версии 0.71 Введена.

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

<?php
function date_i18n( $dateformatstring, $timestamp_with_offset = false, $gmt = false ) {
	global $wp_locale;
	$i = $timestamp_with_offset;

	if ( false === $i ) {
		$i = current_time( 'timestamp', $gmt );
	}

	/*
	 * Store original value for language with untypical grammars.
	 * See https://core.trac.wordpress.org/ticket/9396
	 */
	$req_format = $dateformatstring;

	$dateformatstring = preg_replace( '/(?<!\\\\)c/', DATE_W3C, $dateformatstring );
	$dateformatstring = preg_replace( '/(?<!\\\\)r/', DATE_RFC2822, $dateformatstring );

	if ( ( ! empty( $wp_locale->month ) ) && ( ! empty( $wp_locale->weekday ) ) ) {
		$datemonth            = $wp_locale->get_month( date( 'm', $i ) );
		$datemonth_abbrev     = $wp_locale->get_month_abbrev( $datemonth );
		$dateweekday          = $wp_locale->get_weekday( date( 'w', $i ) );
		$dateweekday_abbrev   = $wp_locale->get_weekday_abbrev( $dateweekday );
		$datemeridiem         = $wp_locale->get_meridiem( date( 'a', $i ) );
		$datemeridiem_capital = $wp_locale->get_meridiem( date( 'A', $i ) );
		$dateformatstring     = ' ' . $dateformatstring;
		$dateformatstring     = preg_replace( '/([^\\\])D/', "\\1" . backslashit( $dateweekday_abbrev ), $dateformatstring );
		$dateformatstring     = preg_replace( '/([^\\\])F/', "\\1" . backslashit( $datemonth ), $dateformatstring );
		$dateformatstring     = preg_replace( '/([^\\\])l/', "\\1" . backslashit( $dateweekday ), $dateformatstring );
		$dateformatstring     = preg_replace( '/([^\\\])M/', "\\1" . backslashit( $datemonth_abbrev ), $dateformatstring );
		$dateformatstring     = preg_replace( '/([^\\\])a/', "\\1" . backslashit( $datemeridiem ), $dateformatstring );
		$dateformatstring     = preg_replace( '/([^\\\])A/', "\\1" . backslashit( $datemeridiem_capital ), $dateformatstring );

		$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) - 1 );
	}
	$timezone_formats    = array( 'P', 'I', 'O', 'T', 'Z', 'e' );
	$timezone_formats_re = implode( '|', $timezone_formats );
	if ( preg_match( "/$timezone_formats_re/", $dateformatstring ) ) {
		$timezone_string = get_option( 'timezone_string' );
		if ( false === $timestamp_with_offset && $gmt ) {
			$timezone_string = 'UTC';
		}
		if ( $timezone_string ) {
			$timezone_object = timezone_open( $timezone_string );
			$date_object     = date_create( null, $timezone_object );
			foreach ( $timezone_formats as $timezone_format ) {
				if ( false !== strpos( $dateformatstring, $timezone_format ) ) {
					$formatted        = date_format( $date_object, $timezone_format );
					$dateformatstring = ' ' . $dateformatstring;
					$dateformatstring = preg_replace( "/([^\\\])$timezone_format/", "\\1" . backslashit( $formatted ), $dateformatstring );
					$dateformatstring = substr( $dateformatstring, 1, strlen( $dateformatstring ) - 1 );
				}
			}
		} else {
			$offset = get_option( 'gmt_offset' );
			foreach ( $timezone_formats as $timezone_format ) {
				if ( 'I' === $timezone_format ) {
					continue;
				}

				if ( false !== strpos( $dateformatstring, $timezone_format ) ) {
					if ( 'Z' === $timezone_format ) {
						$formatted = (string) ( $offset * HOUR_IN_SECONDS );
					} else {
						$prefix    = '';
						$hours     = (int) $offset;
						$separator = '';
						$minutes   = abs( ( $offset - $hours ) * 60 );

						if ( 'T' === $timezone_format ) {
							$prefix = 'GMT';
						} elseif ( 'e' === $timezone_format || 'P' === $timezone_format ) {
							$separator = ':';
						}

						$formatted = sprintf( '%s%+03d%s%02d', $prefix, $hours, $separator, $minutes );
					}

					$dateformatstring = ' ' . $dateformatstring;
					$dateformatstring = preg_replace( "/([^\\\])$timezone_format/", "\\1" . backslashit( $formatted ), $dateformatstring );
					$dateformatstring = substr( $dateformatstring, 1 );
				}
			}
		}
	}
	$j = @date( $dateformatstring, $i );

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

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

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

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

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

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

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

    Ответить4.1 года назад #
    • Kama7602

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

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

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

    Ответить3.7 года назад #
    • Kama7602

      Да, но для этого нужно добавить хак: вот такой код в файл 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
      Ответить3.7 года назад #
  • Артём

    Скажите пожалуйста, почему независимо от значения параметра $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.

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

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

      Ответить1.3 года назад #
    • Kama7602

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

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

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

      Ответить1.3 года назад #
Здравствуйте, !     Войти . Зарегистрироваться