【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

年月日~年月日を月単位で取り出したいのですが、
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を返します。

A 回答 (3件)

こんな感じでどうですかねぇ。



<?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;
}
    • good
    • 0

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);
    • good
    • 0

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);
    • good
    • 0
この回答へのお礼

大変遅くなりすみません。ありがとうございます。

DateIntervalが使えないようで、エラーが出てしまいました。

phpのバージョンは、5.2.10なのですが・・・

お礼日時:2011/09/14 14:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報