为了获得当前的datetime和2天前的datetime,我编写了以下代码;

$now        = new \DateTime();
$twoDaysAgo = $now->sub(new \DateInterval('P2D'));

当我运行var_dump($now, $twoDaysAgo);时,结果如下。
// $now
object(DateTime)#496 (3) {
  ["date"]=>
  string(19) "2014-08-04 16:31:08"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

// $twoDaysAgo
object(DateTime)#496 (3) {
  ["date"]=>
  string(19) "2014-08-04 16:31:08"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}

这两个变量具有相同的$ twoDaysAgo值。为了获得所需的值,我执行了以下操作;
$now        = new \DateTime();
$twoDaysAgo = new \DateTime();
$twoDaysAgo = $twoDaysAgo->sub(new \DateInterval('P2D'));

我的问题是,分配$ twoDaysAgo后,为什么$ now和$ twoDaysAgo的值相同,而不是将$ now作为当前日期时间值?

最佳答案

::sub()将更改它被调用的对象,然后返回自身。
可以通过在操作之前克隆$now来解决此问题,如下所示:

$now        = new \DateTime();
$twoDaysAgo = clone $now; // clone the current date object
$twoDaysAgo->sub(new \DateInterval('P2D')); // work with the clone

关于php - 当分配了其他变量时,DateTime对象正在更改,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25166109/

10-12 16:04