Add built local::lib
[catagits/Gitalist.git] / local-lib5 / lib / perl5 / DateTime / TimeZone / OlsonDB / Rule.pm
CommitLineData
3fea05b9 1package DateTime::TimeZone::OlsonDB::Rule;
2
3use strict;
4use warnings;
5
6use DateTime;
7use DateTime::Duration;
8use DateTime::TimeZone::OlsonDB;
9
10use Params::Validate qw( validate SCALAR );
11
12sub new
13{
14 my $class = shift;
15 my %p = validate( @_, { name => { type => SCALAR },
16 from => { type => SCALAR },
17 to => { type => SCALAR },
18 type => { type => SCALAR, default => undef },
19 in => { type => SCALAR },
20 on => { type => SCALAR },
21 at => { type => SCALAR },
22 save => { type => SCALAR },
23 letter => { type => SCALAR, default => '' },
24 },
25 );
26
27 my $save = $p{save};
28
29 if ($save)
30 {
31 $p{offset_from_std} = DateTime::TimeZone::offset_as_seconds($save);
32 }
33 else
34 {
35 $p{offset_from_std} = 0;
36 }
37
38 return bless \%p, $class;
39}
40
41sub name { $_[0]->{name} }
42sub offset_from_std { $_[0]->{offset_from_std} }
43sub letter { $_[0]->{letter} }
44sub min_year { $_[0]->{from} }
45
46sub max_year { $_[0]->{to} eq 'only' ? $_[0]->min_year :
47 $_[0]->{to} eq 'max' ? undef : $_[0]->{to} }
48
49sub is_infinite { $_[0]->{to} eq 'max' ? 1 : 0 }
50
51sub month { $DateTime::TimeZone::OlsonDB::MONTHS{ $_[0]->{in} } }
52sub on { $_[0]->{on} }
53sub at { $_[0]->{at} }
54
55sub utc_start_datetime_for_year
56{
57 my $self = shift;
58 my $year = shift;
59 my $offset_from_utc = shift;
60 # should be the offset of the _previous_ rule
61 my $offset_from_std = shift;
62
63 my $day =
64 DateTime::TimeZone::OlsonDB::parse_day_spec( $self->on, $self->month, $year );
65
66 my $utc =
67 DateTime::TimeZone::OlsonDB::utc_datetime_for_time_spec
68 ( spec => $self->at,
69 year => $year,
70 month => $self->month,
71 day => $day,
72 offset_from_utc => $offset_from_utc,
73 offset_from_std => $offset_from_std,
74 );
75
76 return $utc;
77}
78
791;