Добавление месяцев в DateTime с DateInterval изменяет исходную дату для соответствия новой дате

У меня есть этот довольно простой код:

$start_date = new DateTime($post['start_date']); $end_date = $start_date->add(new DateInterval('P6M')); echo $start_date->getTimestamp(); // 1351836000 echo $end_date->getTimestamp(); // 1351836000 

Конечно, оба заканчиваются как одна и та же временная метка, потому что добавление интервала дат влияет на исходный $ start_date. Итак, как я могу это сделать, чтобы сохранить исходный $ start_date еще 6 месяцев в другой переменной?

Я пробовал это без везения:

 $start_date = new DateTime($post['start_date']); $start_date_actual = $start_date; $end_date = $start_date_actual->add(new DateInterval('P6M'))->getTimestamp(); 

Переменные содержат ссылки на объекты, а не сами объекты. Таким образом, присваивание дает вам больше переменных, указывающих на один и тот же объект, а не на несколько копий объекта.

Если вы хотите получить копию, используйте ключевое слово clone :

 $end_date = clone $start_date; $end_date->add(new DateInterval('P6M')); 

Вы можете выбрать:

 $start_date = new DateTime($post['start_date']); $end_date = new DateTime($post['start_date']); $end_date->add(new DateInterval('P6M')); 

или

 $start_date = new DateTime($post['start_date']); $end_date = clone $start_date; $end_date->add(new DateInterval('P6M')); 

Клонировать дату начала, прежде чем изменять ее:

 $start_date = new DateTime(); $end_date = clone $start_date; $end_date->add(new DateInterval('P6M')); echo $start_date->getTimestamp(); echo $end_date->getTimestamp(); 

Дополнительную информацию см. В руководстве.