使用日期间隔将月份添加到日期时间会更改原始日期以匹配新日期


Adding months to DateTime with DateInterval changes original date to match new date

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

$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