• 締切済み

日付の範囲を月単位で取り出したい

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

  • rufas
  • お礼率75% (315/420)
  • PHP
  • 回答数3
  • ありがとう数1

みんなの回答

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.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; }

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.2

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)
回答No.1

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);

rufas
質問者

お礼

大変遅くなりすみません。ありがとうございます。 DateIntervalが使えないようで、エラーが出てしまいました。 phpのバージョンは、5.2.10なのですが・・・

関連するQ&A

  • 日付取得

    ある変数に$year='2003', $month='1', $day='5' となっている場合 配列$dateに '2003/1/5' '2003/1/4' '2003/1/3' '2003/1/2' '2003/1/1' '2002/12/31' '2002/12/30'とデータを取得したいです。 また $year='2003', $month='1', $day='' の場合は '2003/1' '2002/12' '2002/11' '2002/10' '2002/9' '2002/8' '2002/7' と取得したいのですが どのようにすればよろしいのでしょうか? すみませんが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 日付の差分の求め方(日、分)

    NT4WS+VC++6.0 Win32コンソールアプリで作ってます。 現在int型で year1,month1,day1 year2,month2,day2 の様に、1と2それぞれ年月日を持っています。 (year2/month2/day2) - (year1/month1/day1) と言った感じで1と2の差が何日かを求めたいのです。 VBで言うDateDiffみたいなことがやりたいのです。 よろしくお願いします。

  • 2つの日付・時間の差分を求めるには

    2つの日付、時間の差分を求めるには、 timelocal を使うのかと思うのですが、 $time1 = timelocal($sec1,$min1,$hours1,$day1,$month1,$year1); $time2 = timelocal($sec2,$min2,$hours2,$day2,$month2,$year2); $result = int(($time2 - $time1)/(60*60*24)); return $result; ではいけないのでしょうか?

    • ベストアンサー
    • Perl
  • 日付関数について

    2021/7/3を関数を使って分離する MONTH, DAY, YEAR使うとそれぞれ7, 3, 2021と分離されます。 これを2021&7&3とそれぞれ結合させると202173となります。 そこで質問です。月、日にちそれぞれ一桁の場合先頭にゼロを持ってきたいのですがどうすればいいのでしょうか。 20210703としたい。 どなたか教えて頂けますでしょうか。

  • PHPメールフォームに入力された内容をcsvに集計したいのですが…

    こんにちは。 PHPでメールフォームを作成していて、CSVファイルにデータをとっているのですが、入力ボックスを分けているものを一つのセルにまとめて集計したいと思っています。 生年月日を例にすると、 入力画面自体は「年(year)、月(month)、日(day)とボックスを分けて入力してもらうようになっているが、 csvデータでは「2007.3.10」のようにまとめて集計したいのです。 今現在、「年」「月」「日」が別々のセルに分かれてしまっていて、大変見づらくてどうにかしたいです。 $CSV["var"] = array( 'year', 'month', 'day'); このように配列で項目を指定しているのですが、まとめて一つのセルに収めるにはどのような書き方をすればいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • Accessで教えてください。

    「生年月日」が入力されているフィールドがあります。この値をクエリーを使って「年」、「月」、「日」に分割したいのですが、方法を教えてください。 Excelのように関数「Year」、「MONTH」、「DAY」を使ってできれば良いのですが。 Accessでの関数の設定方法が分かりません。

  • 日付を入力するには?

    PHP+SQLサーバ2003でWEB作成をしています。 PHPでPOSTされた年月日をSQLサーバのカラム(smalldate型)に格納したいのですが、入力された通りにはDBに日付が格納されないのです。 例)2007/10/10 → (DB)1905/06/14 ソースはこんな感じです。 //年、月、日と入力された値を"年/月/日" の形にする $day = implode("/",array($_POST["year"],$_POST["month"],$_POST["day"])); //入力された日付をDBに格納する。 $sql = "insert into table_name(date) values($day)"; 根本的に何かが間違っていると思われるのですが、よくわかりません。 どなたかアドバイスお願いします。

  • 日付を表示

    H3に日付を入力してます。 B6にこの関数を入力してます。 =IF(DATE(YEAR($H$3),MONTH($H$3),1)*DATE(YEAR($H$3),MONTH($H$3),-5+ROW()),DATE(YEAR($H$3),MONTH($H$3),-5+ROW()),"") これをB6~↓にコピペしてます。 なんだか違う気もしますが、無事に表示されてます。 やりたい事は、月によって日数が変わるとき例えば 29日や31日など この時現在は空いたセルによく月の1日や2日が表示されるのを空白にしたいのです。 後上記の関数以外の用方法がありますか! ちなみにC列には、WEEKDAY関数で曜日を表示させてます。 おねがいします。

  • プログラムの内容

    以下のプログラムは答えとして渡されたものなんですが、 コマンド引数を使ったプログラムの流れがよくわかりません。 簡単に解説してくれる方、いませんか? #include <stdio.h> int leapyear(int year){ if(year%400 == 0) return 1; else if(year%4 == 0 && year%100 != 0) return 1; else return 0; } void addmonth(int *day, int *month, int *year){ *day = 1; (*month)++; if(*month > 12) { *month = 1; (*year)++; } } int main(int argc, char *argv[]){ int year, month, day, a=0, max_days; int month_days[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; if(argc < 2) max_days = 10000; else max_days = atoi(argv[1]); printf("今日は西暦何年 何月 何日? "); scanf("%d%d%d",&year,&month,&day); while(a<max_days) { a++; day++; if(month == 2 && leapyear(year)) { if(day > 29) addmonth(&day, &month, &year); } else { if(day > month_days[month-1]) addmonth(&day, &month, &year); } } printf("今日から%d日後は、%d年%d月%d日です。",max_days, year, month, day); }

  • PHPで、xmlを書き換えたい

    PHP初心者です。 年月日を記録してあるxmlを、phpから書き換えたいのですが、 動作しなくて困っています。。 現在の年月日は 2011.4.7 で 書き換え後の年月日は 2100.9.9 にしたいです。 「index.html」と「memory.xml」が同じフォルダ内にあります。 ●memory.xmlの内容は以下のとおりです-------------------- <?xml version="1.0"?> <memory>   <year>2011</year>   <month>4</month>   <day>7</day> </memory> ●htmlに以下のphpコードを書きました-------------------- <?php   $memoryFile = 'memory.xml';   if ( $xml = simplexml_load_file ( $memoryFile ) ) {     function changeMemory ( $year, $month, $day ) {       $xml -> year = $year; //年の書き換え       $xml -> month = $month; //月の書き換え       $xml -> day = $day; //日の書き換え       $xml -> asXML ( $memoryFile ); //ファイルに書き出す     }     changeMemory ( 2100 , 9 , 9 );   } ?> どうも、以下の1文が作動してくれない気がします。。 $xml -> asXML($memoryFile); //ファイルに書き出す どなたか原因がわかる方いらっしゃいましたら、 なにとぞご教授よろしくお願いいたします。。

    • ベストアンサー
    • PHP

専門家に質問してみよう