Bonus patch: this adds handling of the nautical single-letter timezone
names to DT::TZ::OffsetOnly and DT::TZ. Very simple feature, bound to
be useful to someone.
-zefram
diff -ur dttz-mod1/lib/DateTime/TimeZone/OffsetOnly.pm
dttz-mod2/lib/DateTime/TimeZone/OffsetOnly.pm
--- dttz-mod1/lib/DateTime/TimeZone/OffsetOnly.pm 2007-02-18
15:54:12.000000000 +0000
+++ dttz-mod2/lib/DateTime/TimeZone/OffsetOnly.pm 2007-02-19
22:13:36.809631560 +0000
@@ -11,6 +11,14 @@
use DateTime::TimeZone::UTC;
use Params::Validate qw( validate SCALAR );
+my %letter_offset = (
+ A => +1, B => +2, C => +3, D => +4, E => +5, F => +6,
+ G => +7, H => +8, I => +9, K => +10, L => +11, M => +12,
+ N => -1, O => -2, P => -3, Q => -4, R => -5, S => -6,
+ T => -7, U => -8, V => -9, W => -10, X => -11, Y => -12,
+ Z => 0,
+);
+
sub new
{
my $class = shift;
@@ -18,7 +26,8 @@
} );
my $offset =
- DateTime::TimeZone::offset_as_seconds( $p{offset} );
+ $p{offset} =~ /\A[A-IK-Z]\z/ ? 3600 * $letter_offset{$p{offset}} :
+ DateTime::TimeZone::offset_as_seconds( $p{offset} );
die "Invalid offset: $p{offset}\n" unless defined $offset;
@@ -100,9 +109,13 @@
=head2 DateTime::TimeZone::OffsetOnly->new ( offset => $offset )
-The value given to the offset parameter must be a string such as
-"+0300". Strings will be converted into numbers by the
-C<DateTime::TimeZone::offset_as_seconds()> function.
+Three forms are accepted for the offset parameter. It may be an offset in
+hours, minutes, and optional seconds, each two digits, with no separators
+and optional leading sign, for example "+0300". It may be an offset in
+hours (one or two digits), minutes (two digits), and optional seconds
+(two digits), with ":" separators and optional leading sign, for example
+"-1:01:06". Or it may be a single capital letter other than "J", in
+which case it is interpreted as a nautical timezone name.
=head2 $tz->offset_for_datetime( $datetime )
diff -ur dttz-mod1/lib/DateTime/TimeZone.pm dttz-mod2/lib/DateTime/TimeZone.pm
--- dttz-mod1/lib/DateTime/TimeZone.pm 2007-02-19 20:19:13.383139216 +0000
+++ dttz-mod2/lib/DateTime/TimeZone.pm 2007-02-19 22:08:10.911550810 +0000
@@ -95,7 +95,8 @@
require DateTime::TimeZone::Tzfile;
return DateTime::TimeZone::Tzfile->new( $filename );
}
- elsif ( $name =~ /\A[-+]?(?:\d\d?:\d\d(?::\d\d)?|\d{4}(?:\d\d)?)\z/ )
+ elsif ( $name =~ /\A(?:[-+]?(?:\d\d?:\d\d(?::\d\d)?|\d{4}(?:\d\d)?)|
+ [A-IK-Z])\z/x )
{
require DateTime::TimeZone::OffsetOnly;
return DateTime::TimeZone::OffsetOnly->new( offset => $name );
@@ -606,6 +607,13 @@
=item *
+If the name is a single capital letter, other than "J", it is treated as
+a nautical timezone name, and a C<DateTime::TimeZone::OffsetOnly> object
+is returned. (The case of "Z" is also handled by one of the rules above.
+It means the same thing either way.)
+
+=item *
+
If the name is "floating", then a
C<DateTime::TimeZone::Floating> object is returned. A floating time
zone does have I<any> offset, and is always the same time. This is