首页 > 解决方案 > DateInterval 不添加日期并且没有错误?

问题描述

我正试图将假期一分为二,因为中间有一个日期。

$splitdate = new DateTime($_POST['date']);

// Split date = 2020-08-04
$holiday1end = $holiday2start = $splitdate;

$holiday1end->sub(new DateInterval('P1D'));
$holiday2start->add(new DateInterval('P1D'));

echobr("Holiday 1: ".$holiday1end->format("Y-m-d"));
echobr("Then " . $splitdate->format("Y-m-d"));
echobr("Holiday 1: " . $holiday2start->format("Y-m-d");

这是我得到的输出:

Holiday 1: 2020-08-04
Then 2020-08-04
Holiday 1: 2020-08-04

这没有任何意义,最初我将 DateInterval 设置为“P1D”,但这没有用,所以我尝试删除两天,但我仍然没有得到任何更改或错误。我在这里做错了什么?

为清晰而编辑:$holiday1end 应该比 $splitdate 少一天,$holiday2start 应该比 $splitdate 多一天,但它们都没有改变。

标签: phpdatetimedateinterval

解决方案


似乎当你这样做时,

$splitdate = new DateTime('2010-12-31');
$holiday1end = $holiday2start = $splitdate;

object in 的实例$splitdate作为对其他变量的引用传递。并且由于您sub跟踪和add学习相同的天数,因此代码似乎无法正常工作。然而,它工作正常,但由于同一对象的共享/引用实例,所有效果都指向同一个对象。

但是,如果您执行以下操作,您会注意到日期增加了 1 天(基本上减去 2 天,然后添加 3 天)。

$date = '2010-12-31';

$splitdate = new DateTime($date);
$holiday1end = $holiday2start = $splitdate;

$holiday1end->sub(new DateInterval('P2D'));
$holiday2start->add(new DateInterval('P3D'));

echo "Holiday 1: ".$holiday1end->format("Y-m-d")."\n";
echo "Then " . $splitdate->format("Y-m-d")."\n";
echo "Holiday 2: " . $holiday2start->format("Y-m-d")."\n";

如果你分离DateTime对象实例,你会得到你想要的结果。

$date = '2010-12-31';

$splitdate = new DateTime($date);
$holiday1end = new DateTime($date);
$holiday2start = new DateTime($date);

$holiday1end->sub(new DateInterval('P2D'));
$holiday2start->add(new DateInterval('P2D'));

echo "Holiday 1: ".$holiday1end->format("Y-m-d")."\n";
echo "Then " . $splitdate->format("Y-m-d")."\n";
echo "Holiday 1: " . $holiday2start->format("Y-m-d")."\n";

上述代码的工作示例

具有 1 天差异的示例


推荐阅读