часовой пояс с обработкой летнего времени 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's 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's timezone setting.
event_start_time_string_local is event's start time string in local/civil time.
event_start_timestamp_in_UTC is event's start time timestamp in UTC.

Мои вопросы:

Будут ли PHP API, используемые выше, заботиться о DST для всех регионов?Время DST само меняется в разные годы, как PHP получает информацию об этом? нам нужно обновить PHP? Если да, нужно ли нам обновлять всю или определенную библиотеку PHP?

Рекомендации: -do-phps-date-default-timezone-set-Adjust-Adjust-to-Daylight-Saving -получить часовой пояс-смещение-для-а-Given-места

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

 user557428916 мая 2017 г., 00:02
Это хороший улов.
Решение Вопроса

слишком усложняю это. Для преобразования между двумя часовыми поясами, используяDateTime, сделай это:

date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server

$date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER's timezone
$date->setTimezone(new DateTimeZone('UTC'));
echo $date->format('Y-m-d H:i:s');

Это преобразует из пользователя "местный часовой пояс с UTC. Чтобы перейти наоборот, чтобы отобразить время впо местному времени, поменяйте местами два часовых пояса.

Да, PHP заботится о DST. Необходимые правила преобразования являются частью установки PHP. Вы можете поддерживать их в актуальном состоянии, обновляя PHP или обновляя timezonedb:http://pecl.php.net/package/timezonedb.

 Krishna Shetty24 янв. 2013 г., 07:47
DateTime требует ввода $ в допустимом формате. Но у меня есть $ input в виде массива (например, $ input ['год'], $ input ['месяц'], $ input ['день'], $ input ['час'], $ input ['мин], $ input ['сек»] установлены). Есть ли простой способ преобразовать это в действительный формат, который принимает DateTime? Спасибо
 deceze05 дек. 2012 г., 08:37
 Apostolos07 апр. 2017 г., 19:34
1) Пожалуйста, прочитайте еще раз вопрос / тему этой темы. 2) DST не обрабатывается автоматически, просто устанавливая часовой пояс PHP.
 Krishna Shetty05 дек. 2012 г., 10:08
@deceze Большое спасибо.
 Krishna Shetty04 дек. 2012 г., 14:38
Зачем нам звонитьdate_default_timezone_set (»Азия / Калькутта «)» на старте?
 deceze04 дек. 2012 г., 15:43
@ Krishna И вам нужно настроить свой серверчасовой пояс правильно длявсе функции даты / времени. Если ты'Вы уже сделали это правильно раньше, игнорируйте это.
 Krishna Shetty24 янв. 2013 г., 09:19
@deceze Я думаю, я отформатирую какГ-м-д Х: я: с ' и перейти к DateTime ()
 Krishna Shetty05 дек. 2012 г., 05:29
@deceze или UNIX отметка времени всегда в формате UTC? Я думал, что даже местное время может быть представлено в метке времени UNIX.
 Sven04 дек. 2012 г., 09:42
Обновление timezonedb является регулярной задачей, которая требуется несколько раз в год, потому что каждый раз, когда любая страна вносит изменения, она получает обновление - и это происходит довольно часто.
 Krishna Shetty04 дек. 2012 г., 14:31
Большое спасибо, я буду использовать это
 deceze04 дек. 2012 г., 15:14
Ты можешь использовать'@12345...' для отметок времени UNIX.
 Krishna Shetty04 дек. 2012 г., 14:55
Я думаю, что могу't использовать $ input как метку времени эпохи Unix для DateTime (). В настоящее время в моей системе мы сохраняем время событий как метку времени эпохи Unix, могу ли я использовать то же самое с DateTime ()? В принципе, возможно ли работать с метками времени эпохи Unix вместо строки даты?
 deceze05 дек. 2012 г., 08:33
@Krishna Метка времени UNIX определяется каксекунд с 1970 UTC, Временная метка свободна от часового пояса, но если чтос UTC. Вы можете отформатировать в "местный" время, как показано выше.
 Krishna Shetty05 дек. 2012 г., 05:24
@ deceze, спасибо. Но DateTime док. вphp.net/manual/en/datetime.construct.php говорит "Параметр $ timezone и текущий часовой пояс игнорируются, если параметр $ time либо является меткой времени UNIX (например, @ 946684800), либо указывает часовой пояс (например, 2010-01-28T15: 00: 00 + 02: 00) " - Это значит, что мы можемпередать имя часового пояса? Будет ли ваш код вести себя одинаково, если мы передадим метку времени эпохи Unix? Спасибо

Ваш ответ на вопрос