2016-05-30 76 views
0

我想使用date_adddate_sub加上和減去天數到日期,但我得到了一些奇怪的結果。我認爲這是一個簡單的答案我只是不夠精通PHP知道爲什麼。PHP - 使用DateInterval添加和減少天怪異的錯誤

這裏是我的代碼:

$y = new DateTime('2016-05-17'); 
$z2 = 7; 
$tempy = $y; 
$tempy->sub(new DateInterval('P' . $z2 . 'D')); 
$startdate = date_format($tempy, "Y-m-d"); 
$y->add(new DateInterval('P' . $z2 . 'D')); 
$enddate = date_format($y, "Y-m-d"); 
echo "Start: " . $startdate . " End: " . $enddate . "\r\n"; 

這是結果:

Start: 2016-05-10 End: 2016-05-17

看起來即使我使用一個臨時變量$tempy開始日期仍修改它,結束日期已關閉。

編輯: 預期結果:

Start: 2016-05-10 End: 2016-05-24

+0

您的預期成果是什麼? –

+0

您應該使用DateTime :: format()而不是混合OO和程序代碼(使用date_format) – JesusTheHun

+0

請參閱我所做的編輯。 – Webtron

回答

3

當你這樣做:

$tempy = $y; 

您創建一個僞引用的第一個對象,你實際上並沒有複製它。要做到這一點,你需要使用clone關鍵字:如您所願

$tempy = clone $y; 

現在,事情很快就會過去。如果沒有克隆,當你修改$tempy它還將修改$y

編輯:添加有關此鏈接到手動(來自@德文郡的答案):http://php.net/manual/en/language.oop5.references.php

+0

這是完美和簡單的。謝謝! – Webtron

0

這是不是一個錯誤,這是預期的結果。閱讀上http://php.net/manual/en/language.oop5.references.php

$tempy = $y; 
$tempy->sub(new DateInterval('P' . $z2 . 'D')); 

在這一點上,無論是$ tempy和$ Y有7天減去,因爲它們指向同一個實例。

$y->add(new DateInterval('P' . $z2 . 'D')); 

現在都已經有7天加回它了。唯一的區別是您導出格式化的日期。

0

我認爲你所犯的錯誤是你重新使用了原來的$date,並假定它的狀態不會改變。我也重構了一下你的代碼。在我寫這篇文章的時候,已經發布了幾個答案,但如果我的示例更容易遵循一些答案,我會放棄它。

$date = new DateTime('2016-05-17'); 

$calculateBeforeDate = clone $date; 
$calculateAfterDate = clone $date; 


$startDate = $calculateBeforeDate->sub(new DateInterval('P7D'))->format('Y-m-d'); 

$endDate = $calculateAfterDate->add(new DateInterval('P7D'))->format('Y-m-d'); 

echo "Start: $startDate, End: $endDate" . PHP_EOL; 

你會發現在PHP.net文檔中經常會有可互換的過程風格函數和麪向對象的函數。嘗試儘可能地使用OO,所以不要使用date_format,而是使用它的OO等價物。