Часовой пояс с обработкой 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 не может знать "какой" час (от корректировки до/после), поэтому он не может надежно преобразовать. Надеюсь, это поможет кому-то в его/ее обсуждениях, -)