phpで特定の日付からある日数分前の日付一覧を取得する
PHPである特定の日から1周間前までの日付一覧を取得する必要があった。
そこでこんな関数を作ってみた。
引数は基準日の各要素と取ってくる機関の長さ。
うるう年も考慮している。
計算方法はここを参照。1行で書けるうるう年判別法 - プログラマはサイコロを振らない
private function getDay($year = NULL, $month = NULL, $day = NULL, $length = NULL) { if ($year == NULL) { $year = date('Y'); } if ($month == NULL) { $month = date('m'); } if ($day == NULL) { $day = date('d'); } if ($length == NULL){ $length = 6; } if ($day >= '07'){ $dayList = array('year' => $year, 'month' => $month, 'day' => range($day - $length, $day), ); } else { if ($month != '1') { $dayList = array('year' => $year, 'month' => array( $month - 1, $month, ), 'day' => range($day - $lenght, $day), ); } else { $dayList = array( 'year' => array( $year - 1, $year, ), 'month' => array( 12, 1, ), 'day' => range($day - $length, $day), ); } for ($i = $length; $i >= 0; $i--) { if ($dayList['day'][$i] == 0) { switch($dayList['month'][0]){ case 4: case 6: case 9: case 11: $dayList['day'][$i] = 30; break; case 2: $dayList['day'][$i] = 28 + (1 / ($dayList['year'][0] % 4 + 1)) * (1 - 1 / ($dayList['year'][0] % 100 + 1)) + (1 / ($dayList['year'][0] % 400 + 1)); break; default: $dayList['day'][$i] = 31; } } else if ($dayList['day'][$i] < 0) { $dayList['day'][$i] = $dayList['day'][$i + 1] -1; } } } return $dayList; }
結果はこんな感じ。
getDay(); Array ( [year] => 2013 [month] => 10 [day] => Array ( [0] => 24 [1] => 25 [2] => 26 [3] => 27 [4] => 28 [5] => 29 [6] => 30 ) ) getDay(null, 1, 4, null); Array ( [year] => Array ( [0] => 2012 [1] => 2013 ) [month] => Array ( [0] => 12 [1] => 1 ) [day] => Array ( [0] => 25 [1] => 26 [2] => 27 [3] => 28 [4] => 29 [5] => 30 [6] => 31 [7] => 1 [8] => 2 [9] => 3 [10] => 4 ) )
ただ関数の名前とか返り値は微妙かもしれない。。。
なので呼んだ側でうまく使ってやる必要がある。