- 締切済み
日付の範囲を月単位で取り出したい
年月日~年月日を月単位で取り出したいのですが、 phpのリファレンスを見ても、日付に関して使えそうな関数が見当たりませんでした。 ありそうな処理なので、関数の組み合わせで、 スマートな方法はないでしょうか。 最後はどのような配列の形になってもいいのですが、 以下のように分けたいのです。 2011/8/12~2012/3/20 ↓ 2011/8/12, 2011/8/31 2011/9/1,2011,9,31 ・ ・ 2012/3/1~2012/3/20 $period (0 => array('year' =>2011, 'month' => 8, 'day' => 12), 1 => array('year' =>2012, 'month' => 3, 'day' => 20)); こんな感じで年月日が入っています。 function separeted($period){ $start = $period[0]; $end = $period[1]; $result[] = $start; $result[] = array('year' => $start['year'], 'month' => $start['month'], 'day' => $this->getEndDay($start['month'])); この先、どのようにするかで止まっています。 全く別の方法でも、何かヒントでもいいので、アドバイスください。 getEndDay()関数は、引数の月の最後の日を返す自作関数です。 3月なら31、4月なら30を返します。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
こんな感じでどうですかねぇ。 <?php $period = array(0 => array('year' =>2011, 'month' => 8, 'day' => 12), 1 => array('year' =>2012, 'month' => 3, 'day' => 20)); $start = strtotime($period[0]['year'] . '/' . $period[0]['month'] . '/' . $period[0]['day']); $end = strtotime($period[1]['year'] . '/' . $period[1]['month'] . '/' . $period[1]['day']); $array = array(); $ws = $start; while ($ws < $end) { $we = strtotime(date('Y/m/d', $ws) . ' last day'); if ($we > $end) { $we = $end; } $array[] = array($ws, $we); $ws = strtotime(date('Y/m/d', $we) . ' +1 day'); } // 結果表示 foreach ($array as $val) { print date('Y/m/d', $val[0]) . '-' . date('Y/m/d', $val[1]) . "<br />" . PHP_EOL; }
- masa6272
- ベストアンサー率66% (93/140)
DateIntervalは、5.3からみたいですね。 すみませんでした。 modifyメソッドを使って、次のようにしたらどうでしょう? 5.2を入れてませんので検証できませんが、modifyは5.2から動くはずです。 <?php $period = array(array('year' =>2011, 'month' => 8, 'day' => 12), array('year' =>2012, 'month' => 3, 'day' => 20)); $start = new DateTime(); $start->setDate($period[0]['year'], $period[0]['month'], $period[0]['day']); $end = new DateTime(); $end->setDate($period[1]['year'], $period[1]['month'], $period[1]['day']) ; $fday = new DateTime(); $fday->setDate($period[0]['year'], $period[0]['month'], 1); $nfday = clone $fday; $nfday->modify('+1 month'); $lday = clone $nfday; $lday->modify('-1 day'); while ($fday <= $end) { $results[] = array($fday, $lday); $fday = clone $nfday; $nfday->modify('+1 month'); $lday = clone $nfday; $lday->modify('-1 day'); } $results[0][0] = $start; $results[count($result) - 1][1] = $end; var_dump($results);
- masa6272
- ベストアンサー率66% (93/140)
PHPのバージョンが5.2以後でしたら、こんなのはどうでしょう? <?php $period = array(array('year' =>2011, 'month' => 8, 'day' => 12), array('year' =>2012, 'month' => 3, 'day' => 20)); $start = new DateTime(); $start->setDate($period[0]['year'], $period[0]['month'], $period[0]['day']); $end = new DateTime(); $end->setDate($period[1]['year'], $period[1]['month'], $period[1]['day']); $oneMondth = new DateInterval('P1M'); $oneDay = new DateInterval('P1D'); $fday = new DateTime(); $fday->setDate($period[0]['year'], $period[0]['month'], 1); $nfday = clone $fday; $nfday->add($oneMondth); $lday = clone $nfday; $lday->sub($oneDay); while ($fday <= $end) { $results[] = array($fday, $lday); $fday = clone $nfday; $fday->add($oneMonth); $nfday->add($oneMondth); $lday = clone $nfday; $lday->sub($oneDay); } $results[0][0] = $start; $results[count($result) - 1][1] = $end; var_dump($results);
お礼
大変遅くなりすみません。ありがとうございます。 DateIntervalが使えないようで、エラーが出てしまいました。 phpのバージョンは、5.2.10なのですが・・・