请帮我解决这个问题。我没有得到这个代码的正确输出。这是日期时间添加/子功能中的错误还是我做错了什么?
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>";
}
答案 0 :(得分:0)
返回值
返回方法链接的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
的代码中遇到了同样的问题,解决方案当然是相同的。