Преобразование даты и времени IST в Азию / Калькутта добавляет дополнительное время на 3,5 часа в PHP процедуре DateTime setTimezone () - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть кусок кода

$data = array(
  'fromTimezone'          => 'IST',
  'toTimezone'            => 'Asia/Kolkata',
  'dateTime'              => '2020-04-19 16:23:00',
  'dateTimeFormat'        => 'Y-m-d H:i:s'
);

$fromTimezone           = $data['fromTimezone'];
$toTimezone             = $data['toTimezone'];
$dateTime               = $data['dateTime'];
$dateTimeFormat         = $data['dateTimeFormat'];


$fromZoneDateTime    = new DateTime($dateTime, new DateTimeZone($fromTimezone));

// synchronizing with the to-Timezone
$fromZoneDateTime->setTimezone(new DateTimeZone($toTimezone));

$returnDateTime    = date($dateTimeFormat, strtotime($fromZoneDateTime->format('Y-m-d H:i:s')));
echo $returnDateTime;

Как видите, я конвертирую часовой пояс из IST в Азию / Калькутту. По сути, Азия / Калькутта - это IST (индийское стандартное время) и, следовательно, они оба должны иметь одинаковое время. Но результат, который я получаю, - 2020-04-19 19:53:00.

Что я делаю не так?

Редактировать: -

Кто-то может спросить меня, почему мне нужно преобразовать в IST в Азию / Калькутта. Фактически в приложении Laravel наш часовой пояс по умолчанию - Азия / Калькутта. Но в запросе mysql я получаю часовой пояс как «IST».

SELECT IF(@@session.time_zone = 'SYSTEM', @@system_time_zone, @@session.time_zone) AS mysql_timezone;

В пользовательской таблице часовой пояс пользователя сохраняется как «Азия / Калькутта», «Америка / Нью-Йорк» и др. c, отправляемое из мобильного приложения.

В моих таблицах есть поле с именем created_date (не путать с created_at), которое сохраняет текущую дату и время с помощью PHP. date('Y-m-d H:i:s') процедура. Поэтому, когда я пытаюсь преобразовать это в часовой пояс пользователя, я преобразовываю его из IST в Азию / Калькутту.

1 Ответ

4 голосов
/ 20 апреля 2020

Согласно Википедии Азия / Калькутта, США UTC + 5: 30, где вы получаете разницу в получасе.

Republi c из В Индии используется один часовой пояс - стандартное индийское время (IST). Это UTC + 05:30 - то есть на пять с половиной часов вперед от всемирного координированного времени. ... База данных часовых поясов IANA содержит только одну зону, а именно Азию / Калькутту.

Дополнительная информация

Согласно документы по PHP часовым поясам :

Внимание Пожалуйста не используйте ни один из часовых поясов, перечисленных здесь (кроме UT C), они существуют только по причинам обратной совместимости и могут демонстрировать ошибочное поведение.

Предупреждение Если вы игнорируете вышеупомянутое предупреждение, пожалуйста, обратите внимание, что В базе данных часовых поясов IANA, которая обеспечивает поддержку PHP часовых поясов, используются знаки стиля POSIX, в результате чего часовые пояса Etc / GMT + n и Etc / GMT-n инвертируются из общего использования.

Например, часовой пояс на 8 часов больше GMT, который используется в Китае и Западной Австралии (среди прочих мест), фактически равен Etc / GMT-8 в этой базе данных, а не Etc / GMT + 8, как вы обычно ожидаете.

Один раз Опять же, настоятельно рекомендуется использовать правильный часовой пояс для вашего местоположения, например Азия / Шанхай или Австралия / Перт для приведенных выше примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...