Commit | Line | Data |
3fea05b9 |
1 | package DateTime::TimeZone::OlsonDB::Rule; |
2 | |
3 | use strict; |
4 | use warnings; |
5 | |
6 | use DateTime; |
7 | use DateTime::Duration; |
8 | use DateTime::TimeZone::OlsonDB; |
9 | |
10 | use Params::Validate qw( validate SCALAR ); |
11 | |
12 | sub 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 | |
41 | sub name { $_[0]->{name} } |
42 | sub offset_from_std { $_[0]->{offset_from_std} } |
43 | sub letter { $_[0]->{letter} } |
44 | sub min_year { $_[0]->{from} } |
45 | |
46 | sub max_year { $_[0]->{to} eq 'only' ? $_[0]->min_year : |
47 | $_[0]->{to} eq 'max' ? undef : $_[0]->{to} } |
48 | |
49 | sub is_infinite { $_[0]->{to} eq 'max' ? 1 : 0 } |
50 | |
51 | sub month { $DateTime::TimeZone::OlsonDB::MONTHS{ $_[0]->{in} } } |
52 | sub on { $_[0]->{on} } |
53 | sub at { $_[0]->{at} } |
54 | |
55 | sub 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 | |
79 | 1; |