menu
書いてる野郎
orebike@gmail.com
PHPは長らく日付を文字と数値をごちゃごちゃ操作する関数てんこ盛りの状態で管理してきたがDateTimeクラスが導入されたのでこれを中心に使いましょう
このクラスなぜか、各値にアクセスするアクセサが存在しない。 どういう理由かは不明・・・謎
$dt = new DateTime();
ここら辺は過去の資産バリバリ使えるところだからかなり適当に書いても認識されるだろうな・・・
$dt = new DateTime("2000-12-19");
$dt = new DateTime("2000-12-19 05:13:40");
formatメソッドを使う
$dt->format("Y-m-d H:i:s");
各値へのアクセサが無いのでformatを駆使してやるのかね
modifyメソッドを使うと日付を破壊的に演算することができる。
$d = new DateTime(); $d->modify("-12 year");
formatを利用して適当にやっつける
$base = new DateTime(); $first = new DateTime($base->format('Y-m-01 00:00:00'));
modifyの全貌を理解してないのでもっといいパラメータがあるかも。とりあえず一日は全部の月にあるということを利用して書いた
$base = new DateTime(); //一日作る $last = new DateTime($base->format('Y-m-01 23:59:59')); //一月先に進めて・・・ $last->modify("+1 month"); //一日戻る(月末) $last->modify("-1 day");
途中で生成の分岐を入れるのが面倒なので先に入れ物だけ全部作っておく。あふれた分はあ溢れっぱなしになるので閏年の分以上ループすれば何周してもよい
$dt1 = new DateTime("2011-01-01"); $months = array(); $months[1] = array(); $months[2] = array(); $months[3] = array(); $months[4] = array(); $months[5] = array(); $months[6] = array(); $months[7] = array(); $months[8] = array(); $months[9] = array(); $months[10] = array(); $months[11] = array(); $months[12] = array(); for($i = 0; $i < 400; $i++){ $dt = clone $dt1; $dt->modify(strval($i)." day"); $months[intval($dt->format('m'))][intval($dt->format('d'))] = $dt; }
時刻を秒と捉えて切ったり貼ったりする場合はUnixタイムスタンプに変換すると便利なので
$now = new DateTime(); echo $now->getTimestamp();
このgetTimestampで得られる値はtime関数で得られる値と同じようなものである。