package DateTime::TimeZone;
use strict;
use vars qw( $VERSION );
$VERSION = '0.75';
use DateTime::TimeZoneCatalog;
use DateTime::TimeZone::Floating;
use DateTime::TimeZone::Local;
use DateTime::TimeZone::OffsetOnly;
use DateTime::TimeZone::UTC;
use Params::Validate qw( validate validate_pos SCALAR ARRAYREF BOOLEAN );
use constant INFINITY => 100 ** 1000 ;
use constant NEG_INFINITY => -1 * (100 ** 1000);
# 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 EST5EDT CST6CDT MST7MDT PST8PDT );
sub new
{
my $class = shift;
my %p = validate( @_,
{ name => { type => SCALAR } },
);
if ( exists $DateTime::TimeZone::LINKS{ $p{name} } )
{
$p{name} = $DateTime::TimeZone::LINKS{ $p{name} };
}
elsif ( exists $DateTime::TimeZone::LINKS{ uc $p{name} } )
{
$p{name} = $DateTime::TimeZone::LINKS{ uc $p{name} };
}
unless ( $p{name} =~ m,/,
|| $SpecialName{ $p{name} }
)
{
if ( $p{name} eq 'floating' )
{
return DateTime::TimeZone::Floating->new;
}
if ( $p{name} eq 'local' )
{
return DateTime::TimeZone::Local->TimeZone();
}
if ( $p{name} eq 'UTC' || $p{name} eq 'Z' )
{
return DateTime::TimeZone::UTC->new;
}
return DateTime::TimeZone::OffsetOnly->new( offset => $p{name} );
}
my $subclass = $p{name};
$subclass =~ s/-/_/g;
$subclass =~ s{/}{::}g;
my $real_class = "DateTime::TimeZone::$subclass";
die "The timezone '$p{name}' in an invalid name.\n"
unless $real_class =~ /^\w+(::\w+)*$/;
unless ( $real_class->can('instance') )
{
eval "require $real_class";
if ($@)
{
my $regex = join '.', split /::/, $real_class;
$regex .= '\\.pm';
if ( $@ =~ /^Can't locate $regex/i )
{
die "The timezone '$p{name}' could not be loaded, or is an invalid name.\n";
}
else
{
die $@;
}
}
}
my $zone = $real_class->instance( name => $p{name}, is_olson => 1 );
if ( $zone->is_olson() )
{
my $object_version =
$zone->can('olson_version')
=1= |