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 )