まぁおまいら落ち付いてDateTime Objectでも使おうか。
via. うえちょこ@ぼろぐ» [php]1/1?12/31を出力するには?
1/1〜12/31を出力する - 肉とビールとパンケーキ by @sotarok
まぁまぁ。
うるう年対応とかそう気張らずに、(羨ましさ的な意味で)新世代を担うハチロクぺちぱーならそこで深呼吸してDateTime Objectでも使おうじゃないか。
ちなみに偉そうな事を言ってるけど意外とびくびくしてるぞおいら。
単にふっと思って使ってみただけだったりするのは秘密だ。
<?php $year = (int)$_SERVER["argv"][1]; $month = 1; $day = 1; $format = "Y/m/d"; $timezone = new DatetimeZone("Asia/Tokyo"); // $timezone = new DatetimeZone("Japan"); $date = new Datetime(); $date->setTimezone($timezone); $date->setDate($year, $month, $day); do { echo $date->format($format) . PHP_EOL; $date->modify("+1 day"); } while ($date->format("Y") < $year + 1);
timezoneはノリで書いた。日付だけだしいらないorz
ちゃんとかっこよくやるならDatetime Objectを委譲して使うDatetimeIterator Objectを実装してそっちでイテレート、かなぁと素朴に思う。
楽に書くなら継承してもいいけどSPLが委譲させる実装なので、そっちの方がPHPっぽい(意味不)んじゃないかね。残念ながらSPLにはDatetimeIteratorは無い。。。まぁ実装は簡単そうなので暇があったらやってみる。
オブジェクト志向は相変わらず弱いのでその辺はもっとイケてる人が指摘や補足してくれるとうれしす(他力
-
-
-
- -
-
-
追記:
ちなみに、id:sotarokさんのところのうるう年対応とtimezoneなしの↑でひかくしてみたお><
$ time php dtobj.php 2008 > /dev/null real 0m0.023s user 0m0.008s sys 0m0.008s $ time php mktime.php 2008 > /dev/null real 0m0.041s user 0m0.020s sys 0m0.020s
オブジェクト生成してるけどなかなか早いお><
さらに追記:
あとあと、あとから気づいた
1/1〜12/31を出力するには? - ・・・tohokuaikiのチラシの裏(それ図解できたらいいなぁ)
さんのとこのうるう年版もやってみたお><
$ time php -r 'while(++$i<366+date("L",2008)){echo date("n-j",$n)."\n"; $n+=86400;}' >/dev/null real 0m0.033s user 0m0.020s sys 0m0.012s
Datetime Objectはできるこだお><