У меня есть объект Конвенции с startDate и endDate. Я хочу клонировать этот объект, позволяя выбрать новый startDate. Затем я перенесу все даты дочерних объектов в соответствии с этим смещением даты.
Вот что у меня есть:
$newDate = $_POST('newDate');
$originalConventionBeginDate = clone $convention->getBeginDate();
$newConvention = clone $convention;
$jumpInterval = $originalConventionBeginDate->diff($newDate);
error_log(sprintf("Original: %s", print_r($originalConventionBeginDate, true)));
error_log(sprintf("New date: %s", print_r($newDate, true)));
error_log(print_r($jumpInterval, true));
//more code adding $jumpInterval to child objects' dates
foreach ($newConvention->getHallReservation() as $newHallR)
{
$prevDate = clone $newHallR->getDate();
$prevDate->add($jumpInterval);
$newHallR->setDate($prevDate);
}
В результате, если я клонирую соглашение, начинающееся в 2018-03-01
в 2018-04-01
, $jumpInterval
является 1 месяц и 3 дня, Итак, в то время как новая Конвенция должна начаться в 2018-04-01
его дочерние объекты установлены в 2018-04-04
,
Это моя информация журнала:
Оригинал: объект DateTime ([date] => 2018-03-01 00: 00: 00.000000 [timezone_type] => 3 [timezone] => Европа / Берлин)
Новая дата: объект DateTime ([date] => 2018-04-01 00: 00: 00.000000 [timezone_type] => 3 [timezone] => Европа / Берлин)
DateInterval Object ([y] => 0 [m] => 1 [d] => 3 [h] => 0 [i] => 0 [s] => 0 [weekday] => 0 [weekday_behavior] => 0 [first_last_day_of] => 0 [invert] => 0 [days] => 31 [special_type] => 0 [special_amount] => 0 [have_weekday_relative] => 0 [have_special_relative] => 0)
Я вижу, что JumpInterval также имеет [days] => 31
который кажется более точным, чем [m] => 1 [d] => 3
Может быть, это что-то сделать, сейчас мы в феврале, и в этом месяце 28 дней ??
Какая правильная операция закончена $originalConventionBeginDate
а также $newDate
?
Спасибо
РЕДАКТИРОВАТЬ: Добавлено add()
немного кодировать
Я думаю, вы сможете исправить это, просто изменив:
$prevDate->add($jumpInterval);
чтобы:
$prevDate->modify("+$jumpInterval->days days");
Других решений пока нет …