File Coverage

blib/lib/Time/Piece/Over24.pm
Criterion Covered Total %
statement 103 112 91.9
branch 31 36 86.1
condition 7 10 70.0
subroutine 20 21 95.2
pod 0 13 0.0
total 161 192 83.8


line stmt bran cond sub pod time code
1             package Time::Piece::Over24;
2              
3 2     2   69247 use strict;
  2         5  
  2         71  
4 2     2   11 use warnings;
  2         4  
  2         68  
5 2     2   25 use vars qw/$VERSION/;
  2         3  
  2         71  
6 2     2   8 use Time::Piece;
  2         4  
  2         9  
7              
8             $VERSION = "0.014";
9             my $OVER24_OFFSET = '00:00:00';
10             my $OVER24_BASETIME = localtime;
11              
12 2     2   16 sub import { shift; @_ = ( "Time::Piece", @_ ); goto &Time::Piece::import }
  2         6  
  2         8  
13              
14             package Time::Piece;
15              
16             sub over24 {
17 652     652 0 1983 my ( $self, $time ) = @_;
18              
19 652 100       2073 return $self->from_over24($time) if ($time);
20 2         6 return $self->over24_datetime;
21             }
22              
23             sub over24_time {
24 866     866 0 378593 my ( $self, $time ) = @_;
25 866 100       3070 return $self->from_over24_time($time) if ($time);
26              
27 578         635 my $hour;
28 578         1390 ( $self, $hour ) = $self->_over24_offset_pattern;
29 578         1611 $hour = sprintf( "%02d", $hour );
30 578         2560 return $self->strftime("$hour:%M:%S");
31             }
32              
33             sub over24_year {
34 290     290 0 4956 my ($self) = @_;
35              
36 290         429 my $hour;
37 290         566 ( $self, $hour ) = $self->_over24_offset_pattern;
38 290         907 return $self->year;
39             }
40              
41             sub over24_mon {
42 290     290 0 137375 my ($self) = @_;
43              
44 290         372 my $hour;
45 290         808 ( $self, $hour ) = $self->_over24_offset_pattern;
46 290         893 return $self->mon;
47             }
48              
49             sub over24_mday {
50 290     290 0 139449 my ($self) = @_;
51              
52 290         400 my $hour;
53 290         644 ( $self, $hour ) = $self->_over24_offset_pattern;
54 290         819 return $self->mday;
55             }
56              
57             sub over24_hour {
58 300     300 0 130200 my ($self) = @_;
59 300         413 my $hour;
60 300         564 ( $self, $hour ) = $self->_over24_offset_pattern;
61 300         1096 return $hour;
62             }
63              
64             sub over24_ymd {
65 0     0 0 0 my ($self) = @_;
66 0         0 my $hour;
67 0         0 ( $self, $hour ) = $self->_over24_offset_pattern;
68              
69 0         0 return $self->strftime("%Y-%m-%d $hour:%M:%S");
70             }
71              
72             sub over24_datetime {
73 582     582 0 283648 my ( $self, $datetime ) = @_;
74 582 100       1818 return $self->from_over24_datetime($datetime) if ($datetime);
75              
76 294         406 my $hour;
77 294         583 ( $self, $hour ) = $self->_over24_offset_pattern();
78 294         813 $hour = sprintf( "%02d", $hour );
79 294         1099 return $self->strftime("%Y-%m-%d $hour:%M:%S");
80             }
81              
82             sub from_over24 {
83 938     938 0 18953 my ( $self, $time ) = @_;
84 938 50       2970 if ( $time =~ /^\d\d:\d\d:\d\d$/ ) {
    100          
85 0         0 return $self->from_over24_time($time);
86             }
87             elsif ( $time =~ /^\d\d:\d\d$/ ) {
88 30         75 return $self->from_over24_time( $time . ":00" );
89             }
90             else {
91 908         1763 return $self->from_over24_datetime($time);
92             }
93             }
94              
95             sub from_over24_time {
96 606     606 0 155133 my ( $self, $time ) = @_;
97 606         1905 my $datetime = sprintf("%s %s",$self->ymd,$time);
98 606         9024 return $self->_from_over24($datetime);
99             }
100              
101             sub from_over24_datetime {
102 1486     1486 0 175075 my ( $self, $datetime ) = @_;
103 1486         2973 return $self->_from_over24($datetime);
104             }
105              
106             sub over24_offset {
107 9670     9670 0 204305 my ( $self, $offset ) = @_;
108 9670 100       19518 if ($offset) {
109              
110             #just time
111 2651 50       12150 if ( $offset =~ /^\d\d?$/ ) {
    50          
112 0         0 $offset = sprintf( "%02d:00:00", $offset );
113             }
114             elsif ( $offset =~ /^\d\d?:\d\d$/ ) {
115 0         0 $offset .= ":00";
116             }
117 2651         3647 $OVER24_OFFSET = $offset;
118             }
119 9670         37841 return $OVER24_OFFSET;
120             }
121              
122             sub is_during {
123 892     892 0 231530 my $self = shift;
124 892   50     2470 my $start_time = shift || die "need start_time";
125 892   50     30026 my $end_time = shift || die "need end_time";
126 892   66     35689 my $check_time = shift || $self;
127              
128 892         37722 my $buf_offset = $self->over24_offset;
129 892         1734 $self->over24_offset("00:00:00");
130              
131 892 50       2365 unless ( ( ref($start_time) eq "Time::Piece" ) ==
132             ( ref($end_time) eq "Time::Piece" ) )
133             {
134 0         0 die "start_time and end_time is different object";
135             }
136              
137 892 50       2281 unless ( length($start_time) == length($end_time) ) {
138 0         0 die "start_time and end_time is different format";
139             }
140              
141 892         28966 my $div = 0;
142 892 100       2056 unless ( ref($check_time) eq "Time::Piece" ) {
143 28         32 my $buf = $check_time;
144 28         55 $check_time = $self->over24($check_time);
145 28 100       3306 if ( $buf =~ /^\d\d:\d\d$/ ) {
146 10         20 $div = int( $check_time->over24_hour / 24 );
147             }
148             }
149              
150 892         901 my ( $start_t, $end_t );
151 892 100       1642 if ( ref($start_time) eq "Time::Piece" ) {
152 581         741 $start_t = $start_time;
153 581         828 $end_t = $end_time;
154             }
155             else {
156 311         352 my $t = $check_time;
157 311         533 my $div_time = 86400 * $div;
158 311         844 $start_t = $t->over24($start_time) - $div_time;
159 311         47850 $end_t = $t->over24($end_time) - $div_time;
160             }
161              
162 892 100 100     52540 my $rtn = ( ( $start_t <= $check_time ) && ( $check_time <= $end_t ) )
163             ? '1'
164             : undef;
165 892         21816 $self->over24_offset($buf_offset);
166 892         3529 return $rtn;
167             }
168              
169             sub _over24_offset_object {
170 2042     2042   2438 my ($self) = @_;
171              
172 2042 100       3192 my $ymd =
173             $self->over24_offset eq "00:00:00" ? $OVER24_BASETIME->ymd : $self->ymd;
174 2042         27045 return $self->strptime( sprintf( "%s %s", $ymd, $self->over24_offset ),
175             '%Y-%m-%d %T' );
176             }
177              
178             sub _over24_offset_pattern {
179 2042     2042   2648 my ($self) = @_;
180 2042         4994 my $hour = $self->hour;
181 2042         9505 my $ts = $self - $self->_over24_offset_object;
182              
183 2042 100       225177 my $div = $self->over24_offset eq "00:00:00" ? int( $ts->days ) : 0;
184 2042 100       13917 $div += 1 if ( $ts < 0 );
185 2042 100       30928 if ($div > 0) {
186 682         2030 $self -= 86400 * $div;
187 682         38556 $hour += 24 * $div;
188             }
189              
190 2042         5621 return ( $self, $hour );
191             }
192              
193             sub _from_over24 {
194 2092     2092   2997 my ( $self, $datetime ) = @_;
195              
196 2092         12599 my @hms = split /[\s:]/, $datetime;
197 2092         4023 my $date = shift @hms;
198 2092         8438 my $time = join ":", sprintf( "%02d",$hms[0] % 24 ),$hms[1],$hms[2];
199              
200 2092         11882 $OVER24_BASETIME =
201             $self->strptime( sprintf( "%s %s", $date, $time ), "%Y-%m-%d %T" );
202              
203 2092         61319 return $OVER24_BASETIME + int( $hms[0] / 24 ) * 86400;
204             }
205              
206             1;
207              
208             __END__