File Coverage

blib/lib/DateTime/TimeZone/OlsonDB/Rule.pm
Criterion Covered Total %
statement 24 42 57.1
branch 0 10 0.0
condition 0 5 0.0
subroutine 10 16 62.5
pod 0 12 0.0
total 34 85 40.0


line stmt bran cond sub pod time code
1             package DateTime::TimeZone::OlsonDB::Rule;
2              
3 13     13   96 use strict;
  13         28  
  13         525  
4 13     13   65 use warnings;
  13         40  
  13         676  
5 13     13   73 use namespace::autoclean;
  13         25  
  13         90  
6              
7             our $VERSION = '2.67';
8              
9 13     13   1182 use DateTime::TimeZone::OlsonDB;
  13         26  
  13         8715  
10              
11             sub new {
12 0     0 0 0 my $class = shift;
13 0         0 my %p = @_;
14              
15 0   0     0 $p{letter} ||= q{};
16              
17 0         0 my $save = $p{save};
18              
19             # The handling of q{-} and q{1} are to account for new syntax introduced
20             # in 2009u (and hopefully gone in future versions).
21 0 0 0     0 if ( $save && $save ne q{-} ) {
22 0 0       0 if ( $save =~ /^\d+$/ ) {
23 0         0 $p{offset_from_std} = 3600 * $save;
24             }
25             else {
26             $p{offset_from_std}
27 0         0 = DateTime::TimeZone::offset_as_seconds($save);
28             }
29             }
30             else {
31 0         0 $p{offset_from_std} = 0;
32             }
33              
34 0         0 return bless \%p, $class;
35             }
36              
37 0     0 0 0 sub name { $_[0]->{name} }
38 1862     1862 0 6864 sub offset_from_std { $_[0]->{offset_from_std} }
39 460     460 0 32394 sub letter { $_[0]->{letter} }
40 0     0 0 0 sub min_year { $_[0]->{from} }
41              
42             sub offset_from_std_as_hm {
43 0     0 0 0 my $offset = $_[0]->offset_from_std;
44 0         0 my $h = int( $offset / 3600 );
45 0         0 my $m = ( $offset % 3600 ) / 60;
46 0         0 return sprintf( '%02d:%02d', $h, $m );
47             }
48              
49             sub max_year {
50             $_[0]->{to} eq 'only' ? $_[0]->min_year
51             : $_[0]->{to} eq 'max' ? undef
52 0 0   0 0 0 : $_[0]->{to};
    0          
53             }
54              
55 0 0   0 0 0 sub is_infinite { $_[0]->{to} eq 'max' ? 1 : 0 }
56              
57 482     482 0 2495 sub month { $DateTime::TimeZone::OlsonDB::MONTHS{ $_[0]->{in} } }
58 482     482 0 1752 sub on { $_[0]->{on} }
59 482     482 0 2171 sub at { $_[0]->{at} }
60              
61             sub utc_start_datetime_for_year {
62 482     482 0 1550 my $self = shift;
63 482         793 my $year = shift;
64 482         778 my $offset_from_utc = shift;
65              
66             # should be the offset of the _previous_ rule
67 482         835 my $offset_from_std = shift;
68              
69 482         1337 my ( $month, $day ) = DateTime::TimeZone::OlsonDB::parse_day_spec(
70             $self->on,
71             $self->month,
72             $year,
73             );
74              
75 482         8960 my $utc = DateTime::TimeZone::OlsonDB::utc_datetime_for_time_spec(
76             spec => $self->at,
77             year => $year,
78             month => $month,
79             day => $day,
80             offset_from_utc => $offset_from_utc,
81             offset_from_std => $offset_from_std,
82             );
83              
84 482         1815 return $utc;
85             }
86              
87             1;