Я работаю над календарным приложением. В этом случае пользователи из разных часовых поясов создают / видят события. Я собираюсь следовать ниже, чтобы сохранить время события в 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("Ymd 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.
Мои вопросы:
Ссылки: – do-phps-date-default-timezone-set-adjust-to-daylight-saving – get-timezone-offset-for-a-given-location
Вы слишком изнуряете это. Чтобы преобразовать между двумя часовыми поясами с помощью 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('Ymd H:i:s');
Это преобразуется из локального часового пояса пользователя в UTC. Чтобы перейти на другую сторону, чтобы отобразить время в локальном времени пользователя, замените два часовых пояса.
Да, PHP заботится о DST. Необходимые правила преобразования являются частью установки PHP. Вы можете обновить их, обновив PHP или обновив timezonedb: http://pecl.php.net/package/timezonedb .
Да 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 am-3am, PHP не может знать «какой» час (от корректировки до / после), поэтому он не может надежно преобразовать. Надеюсь, это поможет кому-то в его / ее обсуждениях 😉