mysql2date()WP 0.71

Переводит указанную дату (в виде стоки) в другой формат.

Формат указывается идентично PHP функции date().

Ожидается, что $date передаётся в локальном времени (не UTC).

Форматы 'U' и 'G' вернут число — сумму метки времени + смещения часового пояса сайта. Это нестандартное поведение! Так исторически сложилось, когда можно было передать $data в UTC, чтобы получить метку времени Unix. См. пример ниже.

Функция в отличии от PHP функции date(), будет локализовать (переводить) месяц.

Работает на раннем этапе загрузки WordPress, еще до константы SHORTINIT.

Работает на основе: wp_date()
1 раз — 0.00018 сек (быстро) | 50000 раз — 4.42 сек (быстро)

Хуков нет.

Возвращает

Строку|int|false.

  • число - когда $format = U или G.
  • строка - в остальных случаях.
  • false - в случае ошибки.

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

mysql2date( $format, $date, $translate );
$format(строка) (обязательный)

Формат даты который нам нужно получить. Например, написав j n Y получим: 25 12 2011. Примеры форматов.

Если используются форматы U или G, то в параметре $date нужно указать дату в GMT (UTC) таймзоне! См. пример ниже.

$date(строка) (обязательный)
Дата, которую нужно изменить. Может быть в любом общепринятом формате. Обычно передается в формате MySQL (Y-m-d H:i:s).
$translate(логический)
true - функция будет пытаться переводить название месяцев, дней и т.п. на текущий язык установленный в WordPress (локализовать).
По умолчанию: true

Примеры

0

#1 Как работает функция

echo mysql2date( 'd.M.Y H:i', '2015-07-24 15:23:14' ); // 24.Jul.2015 15:23

echo mysql2date( 'd-m-Y', '2020-10-25' );              // 25-10-2020

echo mysql2date( 'F j, Y', '2023-06-22 10:30:00' );    // June 22, 2023

echo mysql2date( 'l, F jS, Y \a\t g:i A', '2023-06-22 10:30:00', false ); // Thursday, June 22nd, 2023 at 10:30 AM
0

#2 Выведем дату публикации поста в формате d-m-Y:

echo mysql2date( 'd-m-Y', $post->post_date ); // 02-12-2011

Примеры форматов смотрите здесь.

0

#3 Форматы U и G имеют свою особенность!

Форматы U и G - работают одинаково:

echo mysql2date( 'U', '2012-02-23 06:12:45' ); // 1329977565
echo mysql2date( 'G', '2012-02-23 06:12:45' ); // 1329977565

Важно! При использовании формата U и G, передаваемая дата должна быть так же в UTC (GMT) зоне!

Например, если передать дату поста $post->post_data, то мы получим метку времени Unix timestamp + сдвиг таймзоны сайта, а не просто ожидаемую Unix timestamp даты. Такое нестандартное поведение обусловлено легаси кодом!

Пример для проверки:

// здесь мы используем текущее время в UTC (GMT) зоне
$time = mysql2date( 'U', gmdate( 'Y-m-d H:i:s' ) );
var_dump( time() === $time ); // bool(true)

Из-за таких особенностей вообще не рекомендуется использовать mysql2date() для получения UNIX-метки времени. Потому что поведение не очевидное.

Как правильно получить метку времени из даты (не в UTC зоне)

Для этого можно использовать такой код, по которому будет понятно что происходит с датой:

$post_time = date_create( $post->post_date, wp_timezone() )->getTimestamp();

Тут мы передаем дату поста в таймзоне сайта (не в UTC), а получаем UNIX метку времени (как ожидаемо в UTC таймзоне). Так происходит, потому что во втором параметре date_create() мы указываем в какой временной зоне передана дата.

Или можно так:

date_create( $post->post_date_gmt, new \DateTimeZone('UTC') )->getTimestamp();

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

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

Код mysql2date() WP 6.7.1

function mysql2date( $format, $date, $translate = true ) {
	if ( empty( $date ) ) {
		return false;
	}

	$timezone = wp_timezone();
	$datetime = date_create( $date, $timezone );

	if ( false === $datetime ) {
		return false;
	}

	// Returns a sum of timestamp with timezone offset. Ideally should never be used.
	if ( 'G' === $format || 'U' === $format ) {
		return $datetime->getTimestamp() + $datetime->getOffset();
	}

	if ( $translate ) {
		return wp_date( $format, $datetime->getTimestamp(), $timezone );
	}

	return $datetime->format( $format );
}
2 комментария
    Войти