年月日~年月日を月単位で取り出したいのですが、
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件)
- 最新から表示
- 回答順に表示
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;
}
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);
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);
大変遅くなりすみません。ありがとうございます。
DateIntervalが使えないようで、エラーが出てしまいました。
phpのバージョンは、5.2.10なのですが・・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文からメールアドレスの...
-
多次元配列のオーソドックスな...
-
プログラミングのPythonのnoteb...
-
配列から表の生成
-
濁点のソート
-
読み(あ行~わ行)ごとに分け...
-
配列の添え字が小数だとどうなる?
-
行列
-
array_intersectで空欄を比較し...
-
php 1桁になるまでの和 スマー...
-
多次元配列をエンコードする関...
-
HTML_QuickFormのAdvCheckBox ...
-
Smarty 三次元配列を使いたい
-
配列の要素(value)に、変数を...
-
PHPでCSVの一部の行を編集したい
-
UTF-8のXMLがSJISのPHPで文字化け
-
file_existsでファイル名の部分...
-
PHPで変数名にハイフンを使うに...
-
CSVファイルの最終行のデー...
-
【PHP】csvファイルへの書き出...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
配列の要素(value)に、変数を...
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
C言語の配列をPush(追加)する...
-
STLのvectorで作った配列をメン...
-
CArrayの要素としてCStringArra...
-
verilogで、配列の一部をタスク...
-
System.String.Splitでエラー
-
Perlで重複行を削除したい
-
行列
-
C言語 最大値と最小値を求めて...
-
スカラーのベクトル微分
-
PHPで2次元配列を1次元配列に...
-
array_intersectで空欄を比較し...
-
mallocで char *型の配列を確...
-
Pascalの手続きについて
-
複数のforeachをまとめるには
-
数独かを判断するプログラム
-
ソートの名称について
-
PHPのmin関数、「1」以上の数値...
おすすめ情報