Php DateTime添加和减去不影响

时间:2014-02-01 14:02:30

标签: php datetime

请帮我解决这个问题。我没有得到这个代码的正确输出。这是日期时间添加/子功能中的错误还是我做错了什么?

function CallAndSave($startTfr = '')
{
    $interval       = new DateInterval('P91D');
    $GBofficialTime = new DateTime('2014-02-01T08:52:37');
    if ($startTfr == '')
    {
        $startTfr = $GBofficialTime->sub($interval);
        echo"SF=" . $startTfr->format('Y-m-d\Th:i:s') . "<br>";
    }

    $endTto = $GBofficialTime->add($interval);
    echo"GB=" . $GBofficialTime->format('Y-m-d\Th:i:s') . "<br>";
    echo"SF=" . $startTfr->format('Y-m-d\Th:i:s') . "<br>";
    echo"ET=" . $endTto->format('Y-m-d\Th:i:s') . "<br>";

    $date = new stdClass;
    $date->StartingDateFrom = $startTfr->format('Y-m-d\Th:i:s');
    $date->StartingDateTo = $GBofficialTime->format('Y-m-d\Th:i:s');
    $date->EndingDateFrom = $startTfr->format('Y-m-d\Th:i:s');
    $date->EndingDateTo = $endTto->format('Y-m-d\Th:i:s');

    echo "SF=$date->StartingDateFrom <br>";
    echo "ST=$date->StartingDateTo <br>";
    echo "EF=$date->EndingDateFrom <br>";
    echo "ET=$date->EndingDateTo <br>";
    return;
}

输出:

SF=2013-11-02T08:52:37
GB=2014-02-01T08:52:37
SF=2014-02-01T08:52:37
ET=2014-02-01T08:52:37
SF=2014-02-01T08:52:37 
ST=2014-02-01T08:52:37 
EF=2014-02-01T08:52:37 
ET=2014-02-01T08:52:37

日期时间操作仅适用于此代码

if ($startTfr == '')
{
    $startTfr = $GBofficialTime->sub($interval);
    echo"SF=" . $startTfr->format('Y-m-d\Th:i:s') . "<br>";
}

1 个答案:

答案 0 :(得分:0)

来自\DateTime::sub() manual: -

  

返回值

     

返回方法链接的DateTime对象,或者失败时返回FALSE。

这意味着在您的代码中

$GBofficialTime = new DateTime('2014-02-01T08:52:37');
if ($startTfr == ''){
    $startTfr = $GBofficialTime->sub($interval);
    echo"SF=" . $startTfr->format('Y-m-d\Th:i:s') . "<br>";
}

$GBofficialTime$startTfr引用同一个对象。它们不是单独的对象,因此您实际上是从$interval中减去$GBofficialTime

为了避免这种副作用,你需要在调用任何mutator之前克隆$GBofficialTime: -

$GBofficialTime = new DateTime('2014-02-01T08:52:37');
if ($startTfr == ''){
    $startTfr = clone $GBofficialTime;
    $startTfr->sub($interval);
    echo"SF=" . $startTfr->format('Y-m-d\Th:i:s') . "<br>";
}

您在使用$endTto的代码中遇到了同样的问题,解决方案当然是相同的。