PerlのDateTime.pmのstrftimeの%Uと%Wについて
ちょっとstrftimeを再発明していて、%Uと%Wの実装でDataTimeをパk…ゲフンゲフン…参考にさせてもらおうとしたところ、挙動がおかしかったのでした。最初は、何かやっちゃったかと思ったのですが、ソースも怪しかったので、どうやらビンゴっぽいです。
テストコードは以下の通り。
use strict; use warnings; use POSIX qw(strftime); use DateTime; foreach my $year (2005..2008){ my $t = DateTime->new( year => $year, month => 1, day => 1, time_zone => 'Asia/Tokyo' ); printf("\n%-15s %8s %8s %8s\n", $t->year, "POSIX", "DateTime", "Calc"); print('-' x 50, "\n"); foreach my $day (1..8){ $t->set_day($day); my $strftime = strftime('%U:%W', localtime($t->epoch)); my $datetime = $t->strftime('%U:%W'); my $u = sprintf("%02d", int(($t->day_of_year - $t->day_of_week % 7 + 6) / 7)); my $w = sprintf("%02d", int(($t->day_of_year - $t->day_of_week + 7) / 7)); my $calc = "$u:$w"; printf("%s(%s) %8s %8s %8s\n", $t->ymd('/'), $t->day_abbr, $strftime, $datetime, $calc); } }
実行結果は以下の通り。
2005 POSIX DateTime Calc
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
「POSIX」がPOSIXモジュールのstrftimeで、「DateTime」がDateTimeのstrftimeで、Calcは自前で求めたものです。どうやら、日曜日か月曜日で始まる年がアウトの模様です。自前で求めたもの($uと$w)で、とりあえず回避ができます…というか、POSIX使いましょうって事でしょうか。