Вопрос по utc, datetime, timezone-offset, php, dst – часовой пояс с обработкой летнего времени PHP

12

Я работаю над приложением календаря. При этом пользователи из разных часовых поясов создают / просматривают события. Я думаю, чтобы следовать ниже метод, чтобы сохранить время события в 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   ответа
6

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

Это хороший улов. user5574289
22

слишком усложняю это. Для преобразования между двумя часовыми поясами, используя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.

DateTime требует ввода $ в допустимом формате. Но у меня есть $ input в виде массива (например, $ input ['год'], $ input ['месяц'], $ input ['день'], $ input ['час'], $ input ['мин], $ input ['сек»] установлены). Есть ли простой способ преобразовать это в действительный формат, который принимает DateTime? Спасибо Krishna Shetty
@ Кришна Сиstackoverflow.com/a/4812178/476. deceze
1) Пожалуйста, прочитайте еще раз вопрос / тему этой темы. 2) DST не обрабатывается автоматически, просто устанавливая часовой пояс PHP. Apostolos
@deceze Большое спасибо. Krishna Shetty

Похожие вопросы