Часовой пояс с обработкой DST PHP
Я работаю над календарным приложением. В этом случае пользователи из разных часовых поясов создают/видят события.
Я собираюсь следовать ниже, чтобы сохранить время события в UTC и отображать их в локальное время пользователя. Примечание: у пользователя есть предпочтительная настройка часового пояса.
Чтобы сохранить время запуска события как метку времени UTC:
$timezone = new DateTimeZone( $user_timezone_name );
$utcOffset = $timezone->getOffset( new DateTime( $event_start_time_string_local ) );
$event_start_timestamp_local = maketime( $event_start_time_string_local );
//Now add/subtract $utcOffset to/from $event_start_timestamp_local to get event start //time timestamp in UTC and save this result in DB.
Чтобы получить время начала события в пользовательском часовом поясе:
date_default_timezone_set( $user_timezone_name );
$eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC );
Где:
user_timezone_name is user timezone setting.
event_start_time_string_local is event start time string in local/civil time.
event_start_timestamp_in_UTC is event start time timestamp in UTC.
Мои вопросы:
- Используются ли выше используемые API-интерфейсы PHP для DST для всех регионов?
- Время DST само изменяется в разные годы, как PHP получает информацию об этом? нам нужно обновить PHP? Если это так, нам нужно обновить всю или определенную библиотеку PHP?
Литература:
- does-phps-date-default-timezone-set-adjust-to-daylight-saving
- get-timezone-offset-for-a-given-location
Ответы
Ответ 1
Ты слишком усложняешь это. Для преобразования между двумя часовыми поясами с помощью DateTime
сделайте следующее:
date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server
$date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER timezone
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s');
Это преобразует локальный часовой пояс пользователя в UTC. Чтобы наоборот, отображать время по местному времени пользователя, поменяйте местами два часовых пояса.
Да, PHP заботится о DST. Необходимые правила преобразования являются частью установки PHP. Вы можете обновлять их, обновляя PHP или обновляя timezonedb.
Ответ 2
Да php api учитывает DST. Большую часть времени вы можете безопасно выполнять преобразование времени, как показано на рисунке. Проблема в том, что это не всегда возможно/выполнимо или имеет смысл. Рассмотрим ниже пример - в Польше (в 2013 году) 27 октября в 3 часа ваши часы возвращаются на один час, чтобы переключиться на стандартное время (офсет UTC + 01: 00) 31 марта с 2-часовым тактом настраивается вперед на 1 час, чтобы переключиться на лето время (смещение UTC + 02: 00). Теперь посмотрим, как "в реальном времени" тикает в Grenwich/UTC и как работает преобразование PHP из Европы/Варшавы в UTC:
Europe/Warsaw time offset UTC php2utc conversion php offset
2013-10-27 01:00:00 +2 2013-10-26 23:00:00 2013-10-26 23:00:00 +2
2013-10-27 01:30:00 +2 2013-10-26 23:30:00 2013-10-26 23:30:00 +2
2013-10-27 02:00:00 +2 2013-10-27 00:00:00 2013-10-27 01:00:00 +1 *
2013-10-27 02:30:00 +2 2013-10-27 00:30:00 2013-10-27 01:30:00 +1 *
2013-10-27 02:59:00 +2 2013-10-27 00:59:00 2013-10-27 01:59:00 +1 *
3am -> 2am .....................................summer time changes to standard(winter) time @3am we subtract 1h so 3am becomes 2am
2013-10-27 02:00:00 +1 2013-10-27 01:00:00 2013-10-27 01:00:00 +1
2013-10-27 02:30:00 +1 2013-10-27 01:30:00 2013-10-27 01:30:00 +1
2013-10-27 03:00:00 +1 2013-10-27 02:00:00 2013-10-27 02:00:00 +1
2013-10-27 03:30:00 +1 2013-10-27 02:30:00 2013-10-27 02:30:00 +1
Как вы можете видеть от 2 до 3 утра, PHP не может знать "какой" час (от корректировки до/после), поэтому он не может надежно преобразовать.
Надеюсь, это поможет кому-то в его/ее обсуждениях, -)