2016-05-30 9 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を使用していても、それはまだそれを修正のように見え、終了日はオフです。

EDIT: 期待される結果:あなたは唯一の(new DateTimeで行う)一つのオブジェクトを作成している

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

+0

期待どおりの結果が得られましたか? –

+0

OOと手続き型コードを混ぜるのではなく、DateTime :: format()を使うべきです(date_formatの使用) – JesusTheHun

+0

私が行った編集を見てください。 – Webtron

答えて

3

あなたがない:

$tempy = $y; 

あなたが最初のオブジェクトへの擬似参照を作成し、あなたが実際にそれをコピーしないでください。行うにはあなたがcloneキーワードを使用する必要があります:あなたが期待するよう

$tempy = clone $y; 

物事が動作します。クローニングがなければ、あなたは$tempyを変更すると、それはまた$y

EDIT変更します:これはバグではありませんこれについてのマニュアルへのリンクを追加する(デボンの答え@から)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の同等物を使用しました。