|
Packit |
1c5982 |
use warnings;
|
|
Packit |
1c5982 |
use strict;
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
use Test::More tests => 113;
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
{
|
|
Packit |
1c5982 |
package FakeLocalDateTime;
|
|
Packit |
1c5982 |
use Date::ISO8601 0.000 qw(ymd_to_cjdn);
|
|
Packit |
1c5982 |
my $rdn_epoch_cjdn = 1721425;
|
|
Packit |
1c5982 |
sub new {
|
|
Packit |
1c5982 |
my($class, $y, $mo, $d, $h, $mi, $s) = @_;
|
|
Packit |
1c5982 |
return bless({
|
|
Packit |
1c5982 |
rdn => ymd_to_cjdn($y, $mo, $d) - $rdn_epoch_cjdn,
|
|
Packit |
1c5982 |
sod => 3600*$h + 60*$mi + $s,
|
|
Packit |
1c5982 |
}, $class);
|
|
Packit |
1c5982 |
}
|
|
Packit |
1c5982 |
sub local_rd_values { ($_[0]->{rdn}, $_[0]->{sod}, 0) }
|
|
Packit |
1c5982 |
}
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
require_ok "DateTime::TimeZone::Tzfile";
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
my $tz;
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
sub try($$) {
|
|
Packit |
1c5982 |
my($timespec, $offset) = @_;
|
|
Packit |
1c5982 |
$timespec =~ /\A([0-9]{4})-([0-9]{2})-([0-9]{2})T
|
|
Packit |
1c5982 |
([0-9]{2}):([0-9]{2}):([0-9]{2})\z/x or die;
|
|
Packit |
1c5982 |
my $dt = FakeLocalDateTime->new("$1", "$2", "$3", "$4", "$5", "$6");
|
|
Packit |
1c5982 |
my $errcond;
|
|
Packit |
1c5982 |
unless($offset =~ /\A[-+]?[0-9]+\z/) {
|
|
Packit |
1c5982 |
$errcond = $offset;
|
|
Packit |
1c5982 |
$offset = undef;
|
|
Packit |
1c5982 |
}
|
|
Packit |
1c5982 |
is eval { $tz->offset_for_local_datetime($dt) }, $offset,
|
|
Packit |
1c5982 |
"offset for $timespec";
|
|
Packit |
1c5982 |
unless(defined $offset) {
|
|
Packit |
1c5982 |
like $@, qr#\A
|
|
Packit |
1c5982 |
local\ time\ \Q$timespec\E\ does\ not\ exist
|
|
Packit |
1c5982 |
\ in\ the\ [!-~]+\ timezone\ due\ to\ \Q$errcond\E
|
|
Packit |
1c5982 |
\b#x, "error message for $timespec";
|
|
Packit |
1c5982 |
}
|
|
Packit |
1c5982 |
}
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
$tz = DateTime::TimeZone::Tzfile->new("t/London.tz");
|
|
Packit |
1c5982 |
try "1800-01-01T00:00:00", -75;
|
|
Packit |
1c5982 |
try "1920-03-28T01:59:59", +0;
|
|
Packit |
1c5982 |
try "1920-03-28T02:00:00", "offset change";
|
|
Packit |
1c5982 |
try "1920-03-28T02:59:59", "offset change";
|
|
Packit |
1c5982 |
try "1920-03-28T03:00:00", +3600;
|
|
Packit |
1c5982 |
try "1920-10-25T01:59:59", +3600;
|
|
Packit |
1c5982 |
try "1920-10-25T02:00:00", +0;
|
|
Packit |
1c5982 |
try "1920-10-25T02:59:59", +0;
|
|
Packit |
1c5982 |
try "1920-10-25T03:00:00", +0;
|
|
Packit |
1c5982 |
try "1942-04-05T01:59:59", +3600;
|
|
Packit |
1c5982 |
try "1942-04-05T02:00:00", "offset change";
|
|
Packit |
1c5982 |
try "1942-04-05T02:59:59", "offset change";
|
|
Packit |
1c5982 |
try "1942-04-05T03:00:00", +7200;
|
|
Packit |
1c5982 |
try "2039-03-27T00:59:59", +0;
|
|
Packit |
1c5982 |
try "2039-03-27T01:00:00", "offset change";
|
|
Packit |
1c5982 |
try "2039-03-27T01:59:59", "offset change";
|
|
Packit |
1c5982 |
try "2039-03-27T02:00:00", +3600;
|
|
Packit |
1c5982 |
try "2039-10-30T00:59:59", +3600;
|
|
Packit |
1c5982 |
try "2039-10-30T01:00:00", +0;
|
|
Packit |
1c5982 |
try "2039-10-30T01:59:59", +0;
|
|
Packit |
1c5982 |
try "2039-10-30T02:00:00", +0;
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
# The Davis base in Antarctica has been uninhabited at times.
|
|
Packit |
1c5982 |
$tz = DateTime::TimeZone::Tzfile->new("t/Davis.tz");
|
|
Packit |
1c5982 |
try "1953-07-01T12:00:00", "zone disuse";
|
|
Packit |
1c5982 |
try "1957-01-13T06:59:59", "zone disuse";
|
|
Packit |
1c5982 |
try "1957-01-13T07:00:00", +25200;
|
|
Packit |
1c5982 |
try "1960-01-01T12:00:00", +25200;
|
|
Packit |
1c5982 |
try "1964-10-31T23:59:59", +25200;
|
|
Packit |
1c5982 |
try "1964-11-01T00:00:00", "zone disuse";
|
|
Packit |
1c5982 |
try "1967-01-01T12:00:00", "zone disuse";
|
|
Packit |
1c5982 |
try "1969-02-01T06:59:59", "zone disuse";
|
|
Packit |
1c5982 |
try "1969-02-01T07:00:00", +25200;
|
|
Packit |
1c5982 |
try "1980-01-01T12:00:00", +25200;
|
|
Packit |
1c5982 |
try "2009-10-17T23:59:59", +25200;
|
|
Packit |
1c5982 |
try "2009-10-18T00:00:00", +18000;
|
|
Packit |
1c5982 |
try "2010-01-01T12:00:00", +18000;
|
|
Packit |
1c5982 |
try "2010-03-11T00:59:59", +18000;
|
|
Packit |
1c5982 |
try "2010-03-11T01:00:00", "offset change";
|
|
Packit |
1c5982 |
try "2010-03-11T02:59:59", "offset change";
|
|
Packit |
1c5982 |
try "2010-03-11T03:00:00", +25200;
|
|
Packit |
1c5982 |
try "2011-01-01T12:00:00", +25200;
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
# This version of San_Luis.tz has no POSIX-TZ extension rule, because
|
|
Packit |
1c5982 |
# the source data ends with an indefinite-future observance that is on
|
|
Packit |
1c5982 |
# DST, and that can't be expressed in a POSIX-TZ recipe. The correct
|
|
Packit |
1c5982 |
# interpretation of the tzfile is that the zone behaviour is unknown
|
|
Packit |
1c5982 |
# after the final transition time.
|
|
Packit |
1c5982 |
$tz = DateTime::TimeZone::Tzfile->new("t/San_Luis.tz");
|
|
Packit |
1c5982 |
try "2008-01-01T12:00:00", -7200;
|
|
Packit |
1c5982 |
try "2008-01-20T22:59:59", -7200;
|
|
Packit |
1c5982 |
try "2008-01-20T23:00:00", -10800;
|
|
Packit |
1c5982 |
try "2008-02-01T12:00:00", -10800;
|
|
Packit |
1c5982 |
try "2008-03-08T22:59:59", -10800;
|
|
Packit |
1c5982 |
try "2008-03-08T23:00:00", -14400;
|
|
Packit |
1c5982 |
try "2008-06-01T12:00:00", -14400;
|
|
Packit |
1c5982 |
try "2008-10-11T23:59:59", -14400;
|
|
Packit |
1c5982 |
try "2008-10-12T00:00:00", "offset change";
|
|
Packit |
1c5982 |
try "2008-10-12T00:59:59", "offset change";
|
|
Packit |
1c5982 |
try "2008-10-12T01:00:00", -10800;
|
|
Packit |
1c5982 |
try "2009-01-01T12:00:00", -10800;
|
|
Packit |
1c5982 |
try "2009-03-07T22:59:59", -10800;
|
|
Packit |
1c5982 |
try "2009-03-07T23:00:00", -14400;
|
|
Packit |
1c5982 |
try "2009-06-01T12:00:00", -14400;
|
|
Packit |
1c5982 |
try "2009-10-10T23:59:59", -14400;
|
|
Packit |
1c5982 |
try "2009-10-11T00:00:00", "missing data";
|
|
Packit |
1c5982 |
try "2010-01-01T12:00:00", "missing data";
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
# Loyston was settled in the early 19th century and ultimately abandoned
|
|
Packit |
1c5982 |
# in 1936 to make way for the Norris Lake. This tzfile is not from the
|
|
Packit |
1c5982 |
# Olson database. It's here to test the handling of a presently-disused
|
|
Packit |
1c5982 |
# zone.
|
|
Packit |
1c5982 |
$tz = DateTime::TimeZone::Tzfile->new("t/Loyston.tz");
|
|
Packit |
1c5982 |
try "1799-01-01T12:00:00", "zone disuse";
|
|
Packit |
1c5982 |
try "1799-12-31T18:24:15", "zone disuse";
|
|
Packit |
1c5982 |
try "1799-12-31T18:24:16", -20144;
|
|
Packit |
1c5982 |
try "1840-01-01T12:00:00", -20144;
|
|
Packit |
1c5982 |
try "1883-11-18T11:24:15", -20144;
|
|
Packit |
1c5982 |
try "1883-11-18T11:24:16", "offset change";
|
|
Packit |
1c5982 |
try "1883-11-18T11:59:59", "offset change";
|
|
Packit |
1c5982 |
try "1883-11-18T12:00:00", -18000;
|
|
Packit |
1c5982 |
try "1900-01-01T12:00:00", -18000;
|
|
Packit |
1c5982 |
try "1918-03-31T01:59:59", -18000;
|
|
Packit |
1c5982 |
try "1918-03-31T02:00:00", "offset change";
|
|
Packit |
1c5982 |
try "1918-03-31T02:59:59", "offset change";
|
|
Packit |
1c5982 |
try "1918-03-31T03:00:00", -14400;
|
|
Packit |
1c5982 |
try "1918-07-01T12:00:00", -14400;
|
|
Packit |
1c5982 |
try "1918-10-27T00:59:59", -14400;
|
|
Packit |
1c5982 |
try "1918-10-27T01:00:00", -18000;
|
|
Packit |
1c5982 |
try "1919-01-01T12:00:00", -18000;
|
|
Packit |
1c5982 |
try "1919-03-30T01:59:59", -18000;
|
|
Packit |
1c5982 |
try "1919-03-30T02:00:00", "offset change";
|
|
Packit |
1c5982 |
try "1919-03-30T02:59:59", "offset change";
|
|
Packit |
1c5982 |
try "1919-03-30T03:00:00", -14400;
|
|
Packit |
1c5982 |
try "1919-07-01T12:00:00", -14400;
|
|
Packit |
1c5982 |
try "1919-10-26T00:59:59", -14400;
|
|
Packit |
1c5982 |
try "1919-10-26T01:00:00", -18000;
|
|
Packit |
1c5982 |
try "1930-01-01T12:00:00", -18000;
|
|
Packit |
1c5982 |
try "1936-03-03T23:59:59", -18000;
|
|
Packit |
1c5982 |
try "1936-03-04T00:00:00", "zone disuse";
|
|
Packit |
1c5982 |
try "1937-01-01T12:00:00", "zone disuse";
|
|
Packit |
1c5982 |
|
|
Packit |
1c5982 |
1;
|