WordPress ломает время (и как его чинить)

Андрей «Rarst» Савченко, WordPress Kyiv Meetup 2019–02

Old man watch

WP ломает время и как его чинить

Андрей «Rarst» Савченко

Вы когда–нибудь...

меняли часовой пояс?

Настройки → Общие → Часовой пояс

Вы когда–нибудь...

локализовывали время?

date_i18n(), the_date(), и т.д.

Очень краткая история времени

  1. солнечное время
  2. городское время
  3. железнодорожное время
  4. часовые пояса
  5. всемирное координированное время (UTC)

Unix время

1 550 923 200

секунд от 1970–01–01 00:00:00 UTC

Unix время

PHP DateTime

$dt = new DateTime();
echo $dt->getTimestamp();
1550923200
echo $dt->formatDATE_RFC3339 );
2019-02-23T14:00:00+02:00
echo $dt->getTimezone()->getName();
Europe/Kiev
php.net/datetime

PHP DateTime

php.net/datetime
PHP Date Book phpdatebook.com
Time on fire

WP время

WpDateTime

github.com/Rarst/wpdatetime

wp_date (в процессе...)

github.com/Rarst/wp-date

Настройка часового пояса WP

настройкаgmt_offsettimezone_string
Киев2'Europe/Kiev'
UTC+2'2'''
#44985

Часовой пояс WP во всех случаях

  1. прочитать timezone_string
  2. если пусто — прочитать gmt_offset
  3. конвертировать число в формат ±00:00 (PHP 5.5+)

WpDateTimeZone для разбора пояса

$timezone WpDateTimeZone::getWpTimezone();
настройка$timezone->getName()
Киев'Europe/Kiev'
UTC+2'+02:00'

С надеждой в wp_date: wp_timezone()

date_i18n()

DateTime date() date_i18n()
язык английский английский текущий WP
часовой пояс произвольный текущий PHP текущий WP
ввод произвольный таймштамп «WP таймштамп»
формат date() date() date(), неполный
developer.wordpress.org/reference/functions/date_i18n

С надеждой в wp_date: wp_date()

Graph of WP Date/Time API calls

Логика date_i18n()

echo date_i18n'Y, F, j, G:i T' );
  1. Y, F, j, G:i T
  2. Y, Февраль, j, G:i T — текущий язык
  3. Y, Февраль, j, G:i \E\E\T — часовой пояс
  4. 2019, Февраль, 23, 14:00 EET — date()

date_i18n() ломается с Unix временем

echo dateDATE_RFC3339time() );
2019-02-23T12:00:00+00:00
echo date_i18nDATE_RFC3339time() ); 2019-02-23T12:00:00+02:00
#38771

post_date

post_datepost_date_gmtpost_title
2019-02-23 12:00:00 2019-02-23 12:00:00 Запись в Лондоне
WP настроен на часовой пояс Лондон:
the_dateDATE_RFC3339 );
2019-02-23T12:00:00+00:00

post_date ломается при смене пояса

post_datepost_date_gmtpost_title
2019-02-23 12:00:00 2019-02-23 12:00:00 Запись в Лондоне
WP настроен на часовой пояс Киев:
the_dateDATE_RFC3339 );
2019-02-23T12:00:00+02:00
#38774

post_date во всех случаях

  1. прочитать post_date_gmt
  2. если пусто — прочитать post_date
  3. прочитать часовой пояс WP
  4. перевести post_date[_gmt] в часовой пояс
  5. перевести в нужный формат

WpDateTime для разбора даты записи

post_datepost_date_gmtpost_title
2019-02-23 12:00:00 2019-02-23 12:00:00 Запись в Лондоне
WP настроен на часовой пояс Киев:
$time WpDateTime::createFromPostget_post() );
echo $time->formatI18nDATE_RFC3339 );
2019-02-23T14:00:00+02:00

С надеждой в wp_date: каноническое UTC.

Выводы

Спасибо за ваше время! Вопросы?

twitter.com/Rarst
wpua.slack.com wordpress.slack.com/messages/core-datetime

Rarst.net/slides/time-kiev

Использованные изображения