DateTimeZone обрабатывает только смещения в одном направлении - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь получить дату не в GMT и преобразовать ее в GMT. Для этого я создаю два часовых пояса (один GMT и один не GMT) и пытаюсь получить смещение между ними. Однако смещение является правильным только в одном направлении. Для этого конкретного примера c я пытаюсь сравнить GMT +4 с GMT. Я ожидаю получить 4 часа (14400 секунд), когда я сравниваю часовой пояс GMT с часовым поясом GMT + 4, и -4 часа (-14400 секунд), когда я сравниваю часовой пояс GMT + 4 с GMT. Однако, сравнивая позже, я получаю 0 ... Вот что у меня есть

$default_timezone = new DateTimeZone(drupal_get_user_timezone());
$default_reg_date = new DateTime($reg_date_string, $default_timezone);

$gmt_timezone = new DateTimeZone('UTC');
$gmt_reg_date = new DateTime($reg_date_string, $gmt_timezone);

// Returns as 14400
$default_gmt_offset = $default_timezone->getOffset($gmt_reg_date);

// Returns as 0
$gmt_default_offset = $gmt_timezone->getOffset($default_reg_date); 

Почему я не могу получить правильный номер, что я делаю не так? Получение смещения работает только в одном направлении?

Примечание: в этом конкретном примере c, drupal_get_user_timezone() возвращает GMT + 4

1 Ответ

2 голосов
/ 01 мая 2020

Из документации PHP :

Эта функция возвращает смещение по Гринвичу для даты / времени, указанных в параметре datetime. Смещение по Гринвичу рассчитывается с использованием информации о часовом поясе, содержащейся в используемом объекте DateTimeZone.

Функция работает с 2 шагами логики:

  1. Преобразование даты в часовой пояс, к которому применяется функция
  2. Получение смещения от GMT

Поэтому вызов этой функции для new DateTimeZone('UTC') всегда будет возвращать 0

Если вы хотите преобразовать дату в UT C, вы можете использовать функцию setTimeZone:

$date_string = '2020-05-01 09:11:00' ;
$date = new DateTime($date_string, new DateTimeZone('Europe/Brussels'));
echo $date->format('c') ; // 2020-05-01T09:11:00+02:00

$date->setTimeZone(new DateTimeZone('UTC'));
echo $date->format('c') ; // 2020-05-01T07:11:00+00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...