使用DateInterval将Date添加到DateTime会更改原始日期以匹配新日期

时间:2012-05-02 18:45:04

标签: php datetime

我有这个非常简单的代码:

$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();

3 个答案:

答案 0 :(得分:15)

变量保持对对象的引用,而不是对象本身。因此赋值只会让你获得更多指向同一个对象的变量,而不是指向对象的多个副本。

如果您想要副本,请使用clone关键字:

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

答案 1 :(得分:2)

你可以选择:

$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'));

答案 2 :(得分:0)

在修改之前克隆开始日期:

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

有关详细信息,请参阅手册