patch for DateTime::TimeZone v0.46
うちのPlaggerがconfigにtimezoneを書かないとこける(つーか、timezoneの指定がないのでこけるテストがあった)問題をなんとかしたかったのでコードを覗いてみたら、DateTime::TimeZone->new('local')がTZ=JST-9のときに自動判別できていなかったので、MLに入ってこんなパッチを投げてみた(んだけど、投げそこねたかな→二重投稿になっていた。恥)。
diff -ru DateTime-TimeZone-0.46/lib/DateTime/TimeZone/Local.pm DateTime-TimeZone-0.46-patched/lib/DateTime/TimeZone/Local.pm --- DateTime-TimeZone-0.46/lib/DateTime/TimeZone/Local.pm 2006-05-09 06:42:05.000000000 +0900 +++ DateTime-TimeZone-0.46-patched/lib/DateTime/TimeZone/Local.pm 2006-07-30 03:12:25.186375000 +0900 @@ -228,7 +228,10 @@ return 0 unless defined $_[0]; return 0 if $_[0] eq 'local'; - return $_[0] =~ m,^[\w/]+$, ? 1 : 0; + return 1 if $_[0] =~ m,^[\w/]+$,; + return 1 if $_[0] =~ m,^\w+\s*[\+\-]\s*\d+$,; + + return 0; } diff -ru DateTime-TimeZone-0.46/lib/DateTime/TimeZone.pm DateTime-TimeZone-0.46-patched/lib/DateTime/TimeZone.pm --- DateTime-TimeZone-0.46/lib/DateTime/TimeZone.pm 2006-05-09 06:42:05.000000000 +0900 +++ DateTime-TimeZone-0.46-patched/lib/DateTime/TimeZone.pm 2006-07-30 03:41:15.264500000 +0900 @@ -448,6 +448,13 @@ { ( $sign, $hours, $minutes, $seconds ) = ( $1, $2, $3, $4 ); } + # allow "TZ = JST - 9" format; this is equivalent to TZ = +0900 + elsif ( $offset =~ /^(\w+)\s*([\+\-])\s*(\d{1,2})$/ ) + { + my $zone; + ( $zone, $sign, $hours, $minutes, $seconds ) = ( $1, $2, $3, 0, 0 ); + $sign =~ tr/\+\-/-+/ unless uc $zone eq 'UTC'; + } else { return undef; diff -ru DateTime-TimeZone-0.46/t/04local.t DateTime-TimeZone-0.46-patched/t/04local.t --- DateTime-TimeZone-0.46/t/04local.t 2006-05-09 06:42:05.000000000 +0900 +++ DateTime-TimeZone-0.46-patched/t/04local.t 2006-07-30 03:19:35.561375000 +0900 @@ -10,7 +10,7 @@ BEGIN { require 'check_datetime_version.pl' } -plan tests => 19; +plan tests => 21; use DateTime::TimeZone; @@ -46,6 +46,22 @@ local *DateTime::TimeZone::Local::_local_from_etc_timezone = sub { undef }; $^W = 1; + local $ENV{TZ} = 'JST - 9'; + + my $tz; + eval { $tz = DateTime::TimeZone->new( name => 'local' ) }; + is( $@, '', 'valid time zone name in $ENV{TZ} should not die' ); + isa_ok( $tz, 'DateTime::TimeZone::OffsetOnly' ); +} + +{ + $^W = 0; + local *DateTime::TimeZone::Local::_from_etc_localtime = sub { undef }; + local *DateTime::TimeZone::Local::_read_etc_sysconfig_clock = sub { undef }; + local *DateTime::TimeZone::Local::_read_etc_default_init = sub { undef }; + local *DateTime::TimeZone::Local::_local_from_etc_timezone = sub { undef }; + $^W = 1; + local $ENV{TZ} = 'Africa/Kinshasa'; my $tz;