我有这个非常简单的代码:
$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();
有关更多信息,请参阅手册
- http://php.net/manual/en/language.oop5.cloning.php
- http://php.net/manual/en/language.oop5.references.php