WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

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(логический)
true - устанавливать часовой пояс равный времени по Гринвичу (‎UTC+0). false - устанавливать часовой пояс по настройкам сайта.
По умолчанию: false

Примеры

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

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

echo date_i18n( 'j M Y', strtotime( '11/15-1976' ) );
// выведет: 28 Сен 2014

Заметки

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

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

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

	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;

	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 ( $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 );
				}
			}
		}
	}
	$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          Unix timestamp.
	 * @param bool   $gmt        Whether to convert to GMT for time. Default false.
	 */
	$j = apply_filters( 'date_i18n', $j, $req_format, $i, $gmt );
	return $j;
}

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

Из метки: localize (локализация Internationalization)

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

date_i18n 6 комментариев
  • Артём

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

    Ответить2 года назад #
    • Kama4477

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

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

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

    Ответить1.6 года назад #
    • Kama4477

      Да, но для этого нужно добавить хак: вот такой код в файл 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;
      }
      
      3
      Ответить1.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.

    Ответитьмесяц назад #

Здравствуйте, !

Ваш комментарий