? $zone->olson_version()
: 'unknown';
my $catalog_version = __PACKAGE__->catalog_olson_version();
if ( $object_version ne $catalog_version )
{
warn "Loaded $real_class, which is from an older version ($object_version) of the Olson database than this
installation of DateTime::TimeZone ($catalog_version).\n";
}
}
return $zone;
}
sub _init
{
my $class = shift;
my %p = validate( @_,
{ name => { type => SCALAR },
spans => { type => ARRAYREF },
is_olson => { type => BOOLEAN, default => 0 },
},
);
my $self = bless { name => $p{name},
spans => $p{spans},
is_olson => $p{is_olson},
}, $class;
foreach my $k ( qw( last_offset last_observance rules max_year ) )
{
my $m = "_$k";
$self->{$k} = $self->$m() if $self->can($m);
}
return $self;
}
sub is_olson { $_[0]->{is_olson} }
sub is_dst_for_datetime
{
my $self = shift;
my $span = $self->_span_for_datetime( 'utc', $_[0] );
return $span->[IS_DST];
}
sub offset_for_datetime
{
my $self = shift;
my $span = $self->_span_for_datetime( 'utc', $_[0] );
return $span->[OFFSET];
}
sub offset_for_local_datetime
{
my $self = shift;
my $span = $self->_span_for_datetime( 'local', $_[0] );
return $span->[OFFSET];
}
sub short_name_for_datetime
{
my $self = shift;
my $span = $self->_span_for_datetime( 'utc', $_[0] );
return $span->[SHORT_NAME];
}
sub _span_for_datetime
{
my $self = shift;
my $type = shift;
my $dt = shift;
my $method = $type . '_rd_as_seconds';
my $end = $type eq 'utc' ? UTC_END : LOCAL_END;
my $span;
my $seconds = $dt->$method();
if ( $seconds < $self->max_span->[$end] )
{
$span = $self->_spans_binary_search( $type, $seconds );
}
else
{
my $until_year = $dt->utc_year + 1;
$span = $self->_generate_spans_until_match( $until_year, $seconds, $type );
}
# This means someone gave a local time that doesn't exist
# (like during a transition into savings time)
unless ( defined $span )
=2= |