File Coverage

blib/lib/Pinwheel/Model/Date.pm
Criterion Covered Total %
statement 53 53 100.0
branch 6 6 100.0
condition 4 4 100.0
subroutine 19 19 100.0
pod 0 12 0.0
total 82 94 87.2


line stmt bran cond sub pod time code
1             package Pinwheel::Model::Date;
2              
3 7     7   108237 use strict;
  7         26  
  7         337  
4 7     7   38 use warnings;
  7         13  
  7         231  
5              
6 7     7   34 use POSIX qw();
  7         14  
  7         195  
7 7     7   35 use Time::Local qw(timegm_nocheck);
  7         14  
  7         1543  
8              
9 7     7   765 use Pinwheel::Model::DateBase;
  7         15  
  7         264  
10 7     7   1434 use Pinwheel::Model::Time;
  7         12  
  7         7041  
11              
12             our @ISA = qw(Pinwheel::Model::DateBase);
13              
14              
15             # Constructors
16              
17             sub new
18             {
19 210     210 0 7952 my ($class, $s) = @_;
20 210         1540 my @t = gmtime($s);
21 210         787 $s += (12 - $t[2]) * 3600;
22 210         269 $t[2] = 12;
23 210         1659 return bless({ s => $s, t => \@t }, $class);
24             }
25              
26             sub now
27             {
28 6     6 0 3253 my $utc = shift;
29 6 100       751 return Pinwheel::Model::Date->new(timegm_nocheck($utc ? gmtime : localtime));
30             }
31              
32             sub parse
33             {
34 9     9 0 1225 my ($str) = @_;
35 9         51 my ($y, $m, $d) = ($str =~ /^(\d{4})(?:-(\d{2}))?(?:-(\d{2}))?$/);
36 9 100       42 return undef unless (defined $y);
37 4         10 return Pinwheel::Model::Date::date($y, $m, $d);
38             }
39              
40             sub date
41             {
42 165     165 0 74526 my ($y, $m, $d) = @_;
43 165   100     4020 return new Pinwheel::Model::Date(
      100        
44             timegm_nocheck(0, 0, 12, $d || 1, ($m || 1) - 1, $y)
45             );
46             }
47              
48             sub from_bbc_week
49             {
50 2     2 0 4 my ($y, $w) = @_;
51 2         3 my ($date, $adjustment);
52            
53 2         11 $date = new Pinwheel::Model::Date(timegm_nocheck(0, 0, 12, 4, 0, $y));
54 2         12 $adjustment = -(($date->wday + 1) % 7);
55 2         19 return $date->offset(days => $adjustment + (7 * ($w - 1)));
56             }
57              
58             sub from_iso_week
59             {
60 2     2 0 5 my ($y, $w) = @_;
61 2         4 my ($date, $adjustment);
62              
63 2         9 $date = new Pinwheel::Model::Date(timegm_nocheck(0, 0, 12, 4, 0, $y));
64 2         9 $adjustment = -(($date->wday - 1) % 7);
65 2         12 return $date->offset(days => $adjustment + (7 * ($w - 1)));
66             }
67              
68             sub _derived
69             {
70 32     32   57 my ($self, $y, $m, $d) = @_;
71 32         88 return new Pinwheel::Model::Date(timegm_nocheck(0, 0, 12, $d, $m, $y));
72             }
73              
74              
75             # Formatting
76              
77             sub iso8601
78             {
79 34     34 0 917 my $t = $_[0]->{t};
80 34         289 return sprintf('%d-%02d-%02d', $t->[5] + 1900, $t->[4] + 1, $t->[3]);
81             }
82              
83              
84             # Type conversion
85              
86             sub toJson
87             {
88 2     2 0 13 return $_[0]->{'s'};
89             }
90              
91             sub sql_param
92             {
93 1     1 0 52 my $t = $_[0]->{t};
94 1         10 return sprintf('%d-%02d-%02d', $t->[5] + 1900, $t->[4] + 1, $t->[3]);
95             }
96              
97             sub route_param
98             {
99             return {
100 1     1 0 15 year => $_[0]->{t}[5] + 1900,
101             month => $_[0]->{t}[4] + 1,
102             day => $_[0]->{t}[3]
103             };
104             }
105              
106             sub to_time
107             {
108 1     1 0 17 Pinwheel::Model::Time::local($_[0]->{t}[5] + 1900, $_[0]->{t}[4] + 1, $_[0]->{t}[3]);
109             }
110              
111             sub difference
112             {
113 4     4 0 19 my ($self, $other) = @_;
114 4         9 my $d = $self->{'s'} - $other->{'s'};
115 4 100       32 return int(($d + ($d < 0 ? -43200 : 43200)) / 86400);
116             }
117              
118             1;
119              
120             __DATA__