読者です 読者をやめる 読者になる 読者になる

絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

まぁおまいら落ち付いてDateTime Objectでも使おうか。

php neta datetime

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はできるこだお><