Непредсказуемый эффект от использования класса DateTimeZone PHP? - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь получить данные даты / времени из базы данных и преобразовать их в строки даты и времени JSON / ISO8601 с добавленным часовым поясом, это продолжение Что определяет (как настроить), какая строка формата используетсяДрайвер php PDO для значений полей даты и времени?

У меня есть следующий тестовый код:

        $t1 = '2019-10-10 00:00:00';
        $t2 = '1899-12-30 06:10:38'; 
        $t3 = '2019-12-30 06:10:38';
        $t4 = '2019-10-10 00:00:01';
        $dt1 = \DateTime::createFromFormat ('Y-m-d H:i:s', $t1, new \DateTimeZone('Europe/Tallinn'));
        $dt2 = \DateTime::createFromFormat ('Y-m-d H:i:s', $t2, new \DateTimeZone('Europe/Tallinn'));
        $dt3 = \DateTime::createFromFormat ('Y-m-d H:i:s', $t3, new \DateTimeZone('Europe/Tallinn'));
        $dt4 = \DateTime::createFromFormat ('Y-m-d H:i:s', $t4, new \DateTimeZone('Europe/Tallinn'));
        return $dt1->format('Y-m-d\TH:i:sO')."\r\n".$dt2->format('Y-m-d\TH:i:sO')."\r\n".$dt3->format('Y-m-d\TH:i:sO')."\r\n".$dt4->format('Y-m-d\TH:i:sO');

Но результат совершенно непредсказуем:

2019-10-10T00:00:00+0300
1899-12-30T06:10:38+0139
2019-12-30T06:10:38+0200
2019-10-10T00:00:01+0300

Я предоставляю точный часовой пояс (Европа / Таллинн) для каждой из 4 строк даты и времени, но фактический часовой пояс для экземпляров DateTime отличается. Я ожидаю 03 или 02 в каждом случае (я не уверен в использовании эффекта перехода на летнее время), но я явно не могу ожидать 0139. Что здесь происходит?

PHP 7.x.

1 Ответ

3 голосов
/ 21 октября 2019

Все часовые пояса верны, +3 применяется в летнее время (с 28 марта по 31 октября), а +2 - нормальное время. О часовом поясе 1899 года также правильно, поскольку вы можете проверить здесь

1899 Timezone

...