Я предполагаю, что ваш сервер работает с Europe/Warsaw
в качестве часового пояса по умолчанию. PHP вычисления даты / времени часто некорректны, если они пересекают границы DST, как это имеет место здесь. Я предлагаю вам сделать все математику в UTC и при необходимости конвертировать из / в местное время.
Пожалуйста, сравните:
$warsaw = new DateTimeZone('Europe/Warsaw');
$utc = new DateTimeZone('UTC');
$start = new DateTime('2018-10-28 04:30:00', $warsaw);
$start->modify('-4 hours');
var_dump($start);
$start = new DateTime('2018-10-28 04:30:00', $warsaw);
$start->setTimezone($utc);
$start->modify('-4 hours');
$start->setTimezone($warsaw);
var_dump($start);
object(DateTime)#3 (3) {
["date"]=>
string(26) "2018-10-28 00:30:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Warsaw"
}
object(DateTime)#4 (3) {
["date"]=>
string(26) "2018-10-28 01:30:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Warsaw"
}
Версия вашего кода для Unix-метки не должна изменяться, поскольку временная метка Unix - это фиксированный момент времени (поэтому она не переключается с часовыми поясами).