File Coverage

blib/lib/Pinwheel/Model/Time.pm
Criterion Covered Total %
statement 67 67 100.0
branch 18 20 90.0
condition 10 10 100.0
subroutine 30 30 100.0
pod 0 21 0.0
total 125 148 84.4


line stmt bran cond sub pod time code
1             package Pinwheel::Model::Time;
2              
3 7     7   27087 use strict;
  7         26  
  7         289  
4 7     7   37 use warnings;
  7         12  
  7         188  
5              
6 7     7   2107 use POSIX qw();
  7         21023  
  7         420  
7 7     7   6332 use Time::Local qw(timegm_nocheck timelocal_nocheck);
  7         22817  
  7         2793  
8              
9 7     7   7718 use Pinwheel::Model::DateBase;
  7         22  
  7         423  
10 7     7   4428 use Pinwheel::Model::Date;
  7         21  
  7         9959  
11              
12             our @ISA = qw(Pinwheel::Model::DateBase);
13              
14              
15             # Constructors
16              
17             sub new
18             {
19 270     270 0 11843 my ($class, $s, $utc) = @_;
20 270 100       899 $s = CORE::time() unless defined($s);
21 270 100       3756 my $t = $utc ? [gmtime $s] : [localtime $s];
22 270 100       2266 return bless({ s => $s, t => $t, u => $utc ? 1 : 0 }, $class);
23             }
24              
25 7     7 0 1254 sub now { new Pinwheel::Model::Time(CORE::time(), shift) }
26 103     103 0 8140 sub utc { new Pinwheel::Model::Time(timegm_nocheck(_make_t(@_)), 1) }
27 79     79 0 35776 sub local { new Pinwheel::Model::Time(timelocal_nocheck(_make_t(@_)), 0) }
28             sub now_0seconds
29             {
30 3     3 0 9305 my $t = now(@_);
31 3         17 $t->{s} -= $t->{t}[0];
32 3         7 $t->{t}[0] = 0;
33 3         7 return $t;
34             }
35              
36             sub _make_t
37             {
38 182   100 182   3744 ($_[5] || 0, $_[4] || 0, $_[3] || 0, $_[2] || 1, ($_[1] || 1) - 1, $_[0]);
      100        
      100        
      100        
      100        
39             }
40              
41             sub _pair
42             {
43 17     17   45 $_[0]->{pair} = $_[1];
44 17         165 return $_[0];
45             }
46              
47             sub _derived
48             {
49 46     46   81 my ($self, $y, $m, $d, $hh, $mm, $ss) = @_;
50 46 100       147 my $fn = $self->{u} ? \&timegm_nocheck : \&timelocal_nocheck;
51 46         142 return new Pinwheel::Model::Time(&$fn($ss, $mm, $hh, $d, $m, $y), $self->{u});
52             }
53              
54              
55             # Date/time values
56              
57 32     32 0 8705 sub timestamp { $_[0]->{s} }
58 6     6 0 35 sub hour { $_[0]->{t}[2] }
59 6     6 0 48 sub min { $_[0]->{t}[1] }
60 5     5 0 31 sub sec { $_[0]->{t}[0] }
61              
62              
63             # Formatting
64              
65             sub hh_mm
66             {
67 2     2 0 17 my $t = $_[0]->{t};
68 2         16 return sprintf('%02d:%02d', $t->[2], $t->[1]);
69             }
70              
71             sub hh_mm_ss
72             {
73 2     2 0 8 my $t = $_[0]->{t};
74 2         15 return sprintf('%02d:%02d:%02d', $t->[2], $t->[1], $t->[0]);
75             }
76              
77             sub rfc822
78             {
79 10     10 0 46 my $utc = $_[0]->getutc;
80 10         21 my $t = $utc->{t};
81 10         43 return sprintf('%s, %02d %s %d %02d:%02d:%02d GMT',
82             $utc->short_day_name,
83             $t->[3], $utc->short_month_name, $t->[5] + 1900,
84             $t->[2], $t->[1], $t->[0]
85             );
86             }
87              
88             sub iso8601
89             {
90 28     28 0 72 my $t = $_[0]->{t};
91 28         335 my $s = sprintf(
92             '%d-%02d-%02dT%02d:%02d:%02d',
93             $t->[5] + 1900, $t->[4] + 1, $t->[3], $t->[2], $t->[1], $t->[0]
94             );
95 28 50       194 return $s . ($t->[8] ? '+01:00' : 'Z');
96             }
97              
98             sub iso8601_ical
99             {
100 2     2 0 6 my $t = $_[0]->{t};
101 2         11 my $s = sprintf(
102             '%d%02d%02dT%02d%02d%02d',
103             $t->[5] + 1900, $t->[4] + 1, $t->[3], $t->[2], $t->[1], $t->[0]
104             );
105 2 50       9 $s .= 'Z' unless $t->[8];
106 2         7 return $s;
107             }
108              
109              
110             # Date/time adjustment
111              
112             sub getutc
113             {
114 23     23 0 56 my $self = shift;
115 23 100       78 return $self if $self->{u};
116 19 100       69 return $self->{pair} if ($self->{pair});
117 15         47 return $self->{pair} = Pinwheel::Model::Time->new($self->{s}, 1)->_pair($self);
118             }
119              
120             sub getlocal
121             {
122 7     7 0 23 my $self = shift;
123 7 100       31 return $self unless $self->{u};
124 4 100       19 return $self->{pair} if ($self->{pair});
125 2         8 return $self->{pair} = Pinwheel::Model::Time->new($self->{s}, 0)->_pair($self);
126             }
127              
128             sub add
129             {
130 4     4 0 15 my ($self, $seconds) = @_;
131 4         18 return new Pinwheel::Model::Time($self->{s} + $seconds, $self->{u});
132             }
133              
134              
135             # Type conversion
136              
137             sub toJson
138             {
139 2     2 0 12 return $_[0]->timestamp;
140             }
141              
142             sub sql_param
143             {
144 2     2 0 24 return $_[0]->getutc->strftime('%Y-%m-%d %H:%M:%S');
145             }
146              
147             sub route_param
148             {
149 2     2 0 10 return $_[0]->timestamp;
150             }
151              
152             sub to_date
153             {
154 1     1 0 14 Pinwheel::Model::Date::date($_[0]->{t}[5] + 1900, $_[0]->{t}[4] + 1, $_[0]->{t}[3]);
155             }
156              
157              
158             1;
159              
160             __DATA__