DateTimeX-Lite
view release on metacpan or search on metacpan
lib/DateTimeX/Lite/TimeZone.pm view on Meta::CPAN
package DateTimeX::Lite::TimeZone;
use strict;
use warnings;
use Carp ();
use DateTimeX::Lite::TimeZone::Catalog;
use DateTimeX::Lite::TimeZone::Floating;
use DateTimeX::Lite::TimeZone::Local;
use DateTimeX::Lite::TimeZone::OffsetOnly;
use DateTimeX::Lite::TimeZone::UTC;
use DateTimeX::Lite::OlsonDB;
use File::ShareDir qw(dist_file);
our %CachedTimeZones;
# the offsets for each span element
use constant UTC_START => 0;
use constant UTC_END => 1;
use constant LOCAL_START => 2;
use constant LOCAL_END => 3;
use constant OFFSET => 4;
use constant IS_DST => 5;
use constant SHORT_NAME => 6;
my %SpecialName = map { $_ => 1 } qw( EST MST HST CET EET MET WET EST5EDT CST6CDT MST7MDT PST8PDT );
sub load {
my ($class, %p) = @_;
my $name = $p{name};
my $conf;
my $zone;
if (defined $name) {
my $links = \%DateTimeX::Lite::TimeZone::Catalog::LINKS;
if ( exists $links->{ $name } ) {
$name = $links->{ $name };
} elsif ( exists $links->{ uc $name } ) {
$name = $links->{ uc $name };
}
}
if (defined $name) {
return $CachedTimeZones{$name} if $CachedTimeZones{$name};
unless ( $name =~ m,/, || $SpecialName{ $name }) {
if ( $name eq 'floating' ) {
return $CachedTimeZones{$name} = DateTimeX::Lite::TimeZone::Floating->new;
}
if ( $name eq 'local' ) {
return $CachedTimeZones{$name} = DateTimeX::Lite::TimeZone::Local->TimeZone();
}
if ( $name eq 'UTC' || $name eq 'Z' ) {
return $CachedTimeZones{$name} = DateTimeX::Lite::TimeZone::UTC->new;
}
return $CachedTimeZones{$name} = DateTimeX::Lite::TimeZone::OffsetOnly->new( offset => $name );
}
$conf = _load_time_zone($name);
}
if (! $conf) {
my $x = $ENV{DATETIMEX_LITE_DEBUG} ? \&Carp::confess : \&Carp::croak ;
$x->( "The timezone '" . ($p{name} || 'undef') . "' could not be loaded, or is an invalid name.\n" );
}
$zone = $class->new(%$conf);
if ( $zone->is_olson() ) {
my $object_version =
$zone->can('olson_version')
? $zone->olson_version()
: 'unknown';
my $catalog_version = DateTimeX::Lite::TimeZone::Catalog->OlsonVersion();
if ( $object_version ne $catalog_version )
{
warn "Loaded $name, which is from an older version ($object_version) of the Olson database than this installation of DateTimeX::Lite::TimeZone ($catalog_version).\n";
}
}
$CachedTimeZones{$name} = $zone;
return $zone;
}
sub new { my $class = shift; bless { @_ }, $class }
( run in 2.107 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )