Hi, with these patches, DateTime::TimeZone->new('local')
will work properly under the cirtcumstances with TZ=JST-9
(common setting in Japan, means TZ=+0900).
Regards,
Kenichi Ishigaki
==========
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 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;