2017-05-31 3 views
1

私が作業しているサイトに次のコードがあります。これは、以前の開発者によって書かれたので、私はそれに対処する方法を正確にわからないのだた:なぜ私の日時計は31日に問題がありますか?

$datetime = new DateTime("$dt_start_ymd +$gap month"); 
$dt_next = new DateTime("Thursday " . $datetime->format('Y-m-01')); 
$dt_next_0 = $dt_next->setTime(02, 00)->getTimestamp(); 
$dt_next = $dt_next->getTimestamp(); 

変数$gapがインクリメント数(1、2、3、など)です。上記のコードは、$gap

(05/07/2017、03/08/2017、07/09/2017)のような月の最初の木曜日を示す日付のシーケンスを出力する必要があります。それぞれの月の最初の木曜日)。

コードはほとんどの日付で問題なく動作しますが、月が31日(つまり2017-05-31)の日付が渡された場合、システムが正常に動作しないことがわかりません。

+0

なぜ彼は毎月の最初の*木曜日をフェッチしているので、Y-m-01ではなくY-m-dまたはY-m-j – clearshot66

+0

@ clearshot66ではありません。 – CD001

+0

それは間違った方法でそれを見ていた – clearshot66

答えて

2

このコードは不必要に複雑であると思います。さらに、指定された日付が31日で、1か月を追加しようとすると、次の月の31日を見つけようとしている状況になります。 12月から1月にかけて。

あなたは

$currentDate = new \DateTime(); 

$iterations = 10; 

for ($i = 0; $i < $iterations; $i++) { 
    $first_thursday = new \DateTime(
     sprintf('first Thursday of %s', $currentDate->format('F Y')) 
    ); 

    $nextDate = new \DateTime($currentDate->format('Y-m-d')); 
    $nextDate->add(new \DateInterval('P1M')); 

    if ($nextDate->format('m') > $currentDate->format('m') + 1) { 
     $nextDate->sub(new \DateInterval('P1D')); 
    } 

    $currentDate = $nextDate; 

    echo $first_thursday->format('Y-m-d'); 
} 

のようなものを検討する必要がありますこれは、今後10ヶ月間、あなたの毎月の最初の木曜日を与えるだろう、と私はあなたが与えた例よりも、より読みやすいと思います。

EDIT:コードを更新して、月をスキップしないようにしました。以下の私のコメントを参照してください。

+0

すばらしい、ありがとう! – evilscary

+1

ハングアップします。私が間違えました。これは、31日に実行される場合、これは時々月をスキップします。変更を加えて編集しましょう。 –

+1

私はその間違いを修正しました。申し訳ありません。私は現在、P1Mの追加の結果が実際に翌月であることを確認するためにチェックしています。そうでない場合は、1日を減算して、それが正しいことを確認します(例:P1Mを2017-05-31に追加すると2017-07-01になります)。 P1Dを引くと2017-06-30が得られます。これは私たちが望む年月です。 –

関連する問題