часовой пояс — проблема преобразования PHP и DST

У меня возникают проблемы с пониманием того, как мой код адаптируется к DST, так как это неправильно с недавним обновлением. Я храню дату и время в базе данных на основе UTC, а затем преобразую ее обратно в местный часовой пояс для отображения. Если PHP принимает во внимание DST, что-то еще не так, потому что все мои сохраненные даты — 1 час.

$stored_date = '2016-11-16 12:04:01'; // in UTC

$dateTime = new DateTime($stored_date, new DateTimeZone('UTC'));
$dateTimeZone = new DateTimeZone('America/New_York');
$dateTime->setTimezone($dateTimeZone);

print_r($dateTime);

На прошлой неделе, до окончания летнего времени, это было бы распечатано 2016-11-16 08:04:01. На этой неделе, теперь, когда летнее время закончилось, оно распечатывается 2016-11-16 07:04:01. Почему разница в часах, если PHP правильно передает сдвиг DST?

Это не должно иметь значения для настроек сервера (я не думаю), потому что я явно делаю преобразование в PHP, верно?

Я готов начать проверку с помощью PHP, чтобы увидеть, действует ли DST, и сместить конвертацию на 1 час, потому что я не могу понять, почему этот час не компенсируется автоматически в классе DateTime.

0

Решение

Нью-Йорк переключается между этими часовыми поясами:

В соответствии с timeanddate.com Смена произойдет 6 ноября. Таким образом, результат правильный: 12 - 5 = 7

Другими словами, PHP прекрасно знает о DST, как мы можем видеть в следующем коде:

$dateTime = new DateTime('2016-11-05 12:04:01', new DateTimeZone('UTC'));
$dateTime->setTimezone(new DateTimeZone('America/New_York'));
echo $dateTime->format('r') . PHP_EOL;

$dateTime = new DateTime('2016-11-06 12:04:01', new DateTimeZone('UTC'));
$dateTime->setTimezone(new DateTimeZone('America/New_York'));
echo $dateTime->format('r') . PHP_EOL;
Sat, 05 Nov 2016 08:04:01 -0400
Sun, 06 Nov 2016 07:04:01 -0500

Вы можете проверить точную информацию, доступную в базе данных времени вашей системы:

$timeZone = new DateTimeZone('America/New_York');
print_r($timeZone->getTransitions(mktime(0, 0, 0, 1, 1, 2016), mktime(0, 0, 0, 12, 31, 2016)));
Array
(
[0] => Array
(
[ts] => 1451602800
[time] => 2015-12-31T23:00:00+0000
[offset] => -18000
[isdst] =>
[abbr] => EST
)

[1] => Array
(
[ts] => 1457852400
[time] => 2016-03-13T07:00:00+0000
[offset] => -14400
[isdst] => 1
[abbr] => EDT
)

[2] => Array
(
[ts] => 1478412000
[time] => 2016-11-06T06:00:00+0000
[offset] => -18000
[isdst] =>
[abbr] => EST
)

)
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector