日期时间添加/减去错误计算

时间:2014-12-02 15:37:55

标签: php datetime date-arithmetic dateinterval

$datenow    = new DateTime();
$dn = $datenow -> format("Y-m-d"); //2014-12-02
$yesterday  = $datenow -> sub(new DateInterval('P1D')) -> format("Y-m-d"); //2014-12-01
$yestertwo  = $datenow -> sub(new DateInterval('P2D')) -> format("Y-m-d"); //2014-11-29
$tomorrow   = $datenow -> add(new DateInterval('P1D')) -> format("Y-m-d"); //2014-11-30
$tomotwo    = $datenow -> add(new DateInterval('P2D')) -> format("Y-m-d"); //2014-12-02

我不得不在这里遗漏一些东西。日期计算似乎已关闭。

更新

$datenow            = new DateTime();
$dn            = $datenow -> format("Y-m-d");
$yesterday     = $datenow -> sub(new DateInterval('P1D')) -> format("Y-m-d");
$yestertwo     = $datenow -> sub(new DateInterval('P1D')) -> format("Y-m-d");
$tomorrow      = $datenow -> add(new DateInterval('P3D')) -> format("Y-m-d");
$tomotwo       = $datenow -> add(new DateInterval('P1D')) -> format("Y-m-d");

现在输出正确的日期。然而,乍一看,它看起来有点混乱和难以理解。任何解决方案?

2 个答案:

答案 0 :(得分:3)

每次$datenow / sub,您都修改 add,因此您实际上正在改变今天的"" #34;装置

答案 1 :(得分:1)

正如@ceejayoz所提到的,当您在add对象上致电subDateTime时,您也会对其进行修改。

从PHP 5.5开始,有一个新类:DateTimeImmutable。这个类也有像addsub这样的方法,但它不是修改原始类,而只是返回一个应用了修改的新对象。

$datenow = new DateTime();替换为$datenow = new DateTimeImmutable();,事情就应该开始了。