使用DateTime类和modify()方法时日期更改

时间:2017-03-21 19:14:16

标签: php datetime

我感觉我的方式围绕着原生于PHP的\ DateTime类,但我发现了一种特殊的习惯。

$date = new \DateTime(date('d-m-Y',time())); //this being todays date 21-03-2017

$first = $date->modify('first day of this month');
var_dump($first); //returns ["date"] => string(26) "2017-03-01..."
$last = $date->modify('last day of this month');
var_dump($first); //returns ["date"] => string(26) "2017-03-31..."

它似乎是通过引用分配的,因此稍后会被修改。我该如何防止这种情况。

1 个答案:

答案 0 :(得分:1)

方法DateTime::modify(add和sub也是)修改类(不要创建新的类)。正如您在manual上看到的那样:

$date = new DateTime('2006-12-12');
$date->modify('+1 day');

echo $date->format('Y-m-d');//2006-12-13

当您使用新变量指定返回的日期时,您只需指定一个参考。这意味着两个变量都在寻找内存中的同一个对象。

$date = new DateTime('2006-12-12');
$nextDay = $date->modify('+1 day');

echo $date->format('Y-m-d');//2006-12-13
echo $nextDay->format('Y-m-d');//2006-12-13

如果您想更改DateTime而不修改对象(创建新对象),请使用DateTimeImmutable

$date = new DateTimeImmutable('2006-12-12');
$nextDay = $date->modify('+1 day');

echo $date->format('Y-m-d');//2006-12-12
echo $nextDay->format('Y-m-d');//2006-12-13

另一种方法是使用clone关键字:

$first = clone $last = new \DateTime(date('d-m-Y',time())); //this being todays date 21-03-2017

$first->modify('first day of this month');
var_dump($first);

$last->modify('last day of this month');
var_dump($last);

代码:https://3v4l.org/rO7Zd 结果:

object(DateTime)#2 (3) {
  ["date"]=>
  string(26) "2017-03-01 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2017-03-31 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(16) "Europe/Amsterdam"
}