Если я снова добавлю объект DateInterval-Object, полученный с помощью DateTime-> diff (), я не окажусь в ожидаемой дате.
Похоже, это связано с часовыми поясами / смещениями времени, когда, какНасколько я понимаю, эти механизмы здесь не должны оказывать никакого влияния.
Я пытаюсь исправить проблему в приложении клиента, которое я отследил до этого. Если это имеет значение: PHP-версия - это PHP 7.3.9 (cli).
Я надеюсь, что это дает хороший пример:
<?php
// expected behaviour
$first = new \DateTime('2020-12-01T00:00:00+00:00');
$second = new \DateTime('2019-01-01T00:00:00+00:00');
$dt = $first->diff($second);
echo $first->add($dt)->format('d.m.Y').PHP_EOL;
echo "Interval:".PHP_EOL;
echo print_r($dt,true).PHP_EOL;
// unexpected behaviour, notice the time-offset
$first = new \DateTime('2020-12-01T00:00:00+01:00');
$second = new \DateTime('2019-01-01T00:00:00+01:00');
$dt = $first->diff($second);
echo $first->add($dt)->format('d.m.Y').PHP_EOL;
echo "Interval:".PHP_EOL;
echo print_r($dt,true).PHP_EOL;
?>
Вывод:
01.01.2019
Interval:
DateInterval Object
(
[y] => 1
[m] => 11
[d] => 0
[h] => 0
[i] => 0
[s] => 0
[f] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 700
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
02.01.2019
Interval:
DateInterval Object
(
[y] => 1
[m] => 10
[d] => 30
[h] => 0
[i] => 0
[s] => 0
[f] => 0
[weekday] => 0
[weekday_behavior] => 0
[first_last_day_of] => 0
[invert] => 1
[days] => 700
[special_type] => 0
[special_amount] => 0
[have_weekday_relative] => 0
[have_special_relative] => 0
)
Я ожидаю, что эти объекты DateInterval-Object совпадают, так как смещение являетсято же самое на обоих объектах DateTime в обоих случаях. Насколько я понимаю, не только результирующий DateTime-объект должен быть таким же (после добавления), за исключением смещения, но и эти DateInterval-Objects должны совпадать.
Чего мне не хватает?