PHP DateTime не правильно рассчитывает время компонента при добавлении через границы DST - PullRequest
0 голосов
/ 12 ноября 2019

Рассмотрим следующий код

$participantTriggerDate = new \DateTime('2019-06-14 09:40:00.000000', new DateTimeZone('US/Central'));
$dateInterval = new \DateInterval('P150D');

$newDate = \DateTimeImmutable::createFromMutable($participantTriggerDate);
$newDate = $newDate->add($dateInterval);

echo(json_encode([
    'participantTriggerDate' => $participantTriggerDate,
    'newDate' => $newDate,
]));

Этот код производит следующий вывод:

{
  "participantTriggerDate": {
    "date": "2019-06-14 09:40:00.000000",
    "timezone_type": 3,
    "timezone": "US/Central"
  },
  "newDate": {
    "date": "2019-11-11 09:40:00.000000",
    "timezone_type": 3,
    "timezone": "US/Central"
  }
}

Однако, поскольку 150 дней после 2019-06-14 пересекают границу летнего времени, не должныPHP вычитать и час от времени? Я думал, что PHP позаботится обо всех беспорядочных вещах DST под капотом. Есть ли способ для меня, чтобы правильно рассчитать это время? Из того, что я прочитал, похоже, что рекомендуемый ответ - преобразовать все в UTC и выполнить там вычисления. Я хотел бы избежать этого, если это возможно. Я подумал, что PHP будет достаточно умен, чтобы знать, что граница DST пересекается, когда я передаю часовой пояс в создание DateTime.

1 Ответ

2 голосов
/ 12 ноября 2019

Когда вы добавляете целые дни, PHP выдает одинаковое время суток, даже если DST изменился. Если вы хотите добавить временной интервал без выполнения этой настройки, вам нужно добавить часы, а не дни. Умножьте количество дней на 24, чтобы получить это.

$dateInterval = new \DateInterval('PT3600H'); // 3600 = 150*24
...