File Coverage

blib/lib/Date/Format/Generic.pm
Criterion Covered Total %
statement 112 122 91.8
branch 19 28 67.8
condition 4 7 57.1
subroutine 59 63 93.6
pod 0 57 0.0
total 194 277 70.0


line stmt bran cond sub pod time code
1             ##
2             ##
3             ##
4              
5             package Date::Format::Generic;
6              
7 6     6   41 use strict;
  6         8  
  6         183  
8 6     6   24 use warnings;
  6         9  
  6         375  
9              
10             our ($epoch, $tzname);
11 6     6   1623 use Time::Zone;
  6         27  
  6         440  
12 6     6   870 use Time::Local;
  6         3884  
  6         14640  
13              
14             our $VERSION = '2.34'; # VERSION: generated
15             # ABSTRACT: Date formatting subroutines
16              
17             sub ctime
18             {
19 17     17 0 190 my($me,$t,$tz) = @_;
20 17         81 $me->time2str("%a %b %e %T %Y\n", $t, $tz);
21             }
22              
23             sub asctime
24             {
25 0     0 0 0 my($me,$t,$tz) = @_;
26 0         0 $me->strftime("%a %b %e %T %Y\n", $t, $tz);
27             }
28              
29             sub _subs
30             {
31 532     532   715 my $fn;
32 532         3677 $_[1] =~ s/
33             %(O?[%a-zA-Z])
34             /
35 1399   66 4   9219 ($_[0]->can("format_$1") || sub { $1 })->($_[0]);
  4         17  
36             /sgeox;
37              
38 532         2871 $_[1];
39             }
40              
41             sub strftime
42             {
43 1     1 0 3 my($pkg,$fmt,$time);
44              
45 1         5 ($pkg,$fmt,$time,$tzname) = @_;
46              
47 1 50       6 my $me = ref($pkg) ? $pkg : bless [];
48              
49 1 50       39 if(defined $tzname)
50             {
51 0         0 $tzname = uc $tzname;
52              
53 0 0       0 $tzname = sprintf("%+05d",$tzname)
54             unless($tzname =~ /\D/);
55              
56 0         0 $epoch = timegm(@{$time}[0..5]);
  0         0  
57              
58 0         0 @$me = gmtime($epoch + tz_offset($tzname) - tz_offset());
59             }
60             else
61             {
62 1         6 @$me = @$time;
63 1         3 undef $epoch;
64             }
65              
66 1         3 _subs($me,$fmt);
67             }
68              
69             sub time2str
70             {
71 511     511 0 525761 my($pkg,$fmt,$time);
72              
73 511         1535 ($pkg,$fmt,$time,$tzname) = @_;
74              
75 511 100       1456 my $me = ref($pkg) ? $pkg : bless [], $pkg;
76              
77 511         916 $epoch = $time;
78              
79 511 100       926 if(defined $tzname)
80             {
81 493         1015 $tzname = uc $tzname;
82              
83 493 50       2369 $tzname = sprintf("%+05d",$tzname)
84             unless($tzname =~ /\D/);
85              
86 493         1600 $time += tz_offset($tzname);
87 493         2087 @$me = gmtime($time);
88             }
89             else
90             {
91 18         475 @$me = localtime($time);
92             }
93 511         1394 $me->[9] = $time;
94 511         1062 _subs($me,$fmt);
95             }
96              
97             my(@DoW,@MoY,@DoWs,@MoYs,@AMPM,%format,@Dsuf);
98              
99             @DoW = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
100              
101             @MoY = qw(January February March April May June
102             July August September October November December);
103              
104             @DoWs = map { substr($_,0,3) } @DoW;
105             @MoYs = map { substr($_,0,3) } @MoY;
106              
107             @AMPM = qw(AM PM);
108              
109             @Dsuf = (qw(th st nd rd th th th th th th)) x 3;
110             @Dsuf[11,12,13] = qw(th th th);
111             @Dsuf[30,31] = qw(th st);
112              
113             %format = ('x' => "%m/%d/%y",
114             'C' => "%a %b %e %T %Z %Y",
115             'X' => "%H:%M:%S",
116             );
117              
118             my @locale;
119             my $locale = "/usr/share/lib/locale/LC_TIME/default";
120             local *LOCALE;
121              
122             if(open(LOCALE,"$locale"))
123             {
124             chop(@locale = );
125             close(LOCALE);
126              
127             @MoYs = @locale[0 .. 11];
128             @MoY = @locale[12 .. 23];
129             @DoWs = @locale[24 .. 30];
130             @DoW = @locale[31 .. 37];
131             @format{"X","x","C"} = @locale[38 .. 40];
132             @AMPM = @locale[41 .. 42];
133             }
134              
135             sub wkyr {
136 8     8 0 16 my($wstart, $wday, $yday) = @_;
137 8         15 $wday = ($wday + 7 - $wstart) % 7;
138 8         41 return int(($yday - $wday + 13) / 7 - 1);
139             }
140              
141             ##
142             ## these 6 formatting routines need to be *copied* into the language
143             ## specific packages
144             ##
145              
146             my @roman = ('',qw(I II III IV V VI VII VIII IX));
147             sub roman {
148 48     48 0 80 my $n = shift;
149              
150 48         156 $n =~ s/(\d)$//;
151 48         109 my $r = $roman[ $1 ];
152              
153 48 100       152 if($n =~ s/(\d)$//) {
154 35         86 (my $t = $roman[$1]) =~ tr/IVX/XLC/;
155 35         72 $r = $t . $r;
156             }
157 48 100       98 if($n =~ s/(\d)$//) {
158 8         18 (my $t = $roman[$1]) =~ tr/IVX/CDM/;
159 8         12 $r = $t . $r;
160             }
161 48 100       99 if($n =~ s/(\d)$//) {
162 4         9 (my $t = $roman[$1]) =~ tr/IVX/M../;
163 4         8 $r = $t . $r;
164             }
165 48         176 $r;
166             }
167              
168 151     151 0 1976 sub format_a { $DoWs[$_[0]->[6]] }
169 1     1 0 6 sub format_A { $DoW[$_[0]->[6]] }
170 151     151 0 606 sub format_b { $MoYs[$_[0]->[4]] }
171 1     1 0 6 sub format_B { $MoY[$_[0]->[4]] }
172 1     1 0 5 sub format_h { $MoYs[$_[0]->[4]] }
173 5 100   5 0 36 sub format_p { $_[0]->[2] >= 12 ? $AMPM[1] : $AMPM[0] }
174 0 0   0 0 0 sub format_P { lc($_[0]->[2] >= 12 ? $AMPM[1] : $AMPM[0]) }
175              
176 20     20 0 89 sub format_d { sprintf("%02d",$_[0]->[3]) }
177 178     178 0 1067 sub format_e { sprintf("%2d",$_[0]->[3]) }
178 194     194 0 709 sub format_H { sprintf("%02d",$_[0]->[2]) }
179 12   50 12 0 90 sub format_I { sprintf("%02d",$_[0]->[2] % 12 || 12)}
180 8     8 0 43 sub format_j { sprintf("%03d",$_[0]->[7] + 1) }
181 8     8 0 49 sub format_k { sprintf("%2d",$_[0]->[2]) }
182 8   50 8 0 50 sub format_l { sprintf("%2d",$_[0]->[2] % 12 || 12)}
183 4     4 0 17 sub format_L { $_[0]->[4] + 1 }
184 20     20 0 136 sub format_m { sprintf("%02d",$_[0]->[4] + 1) }
185 198     198 0 649 sub format_M { sprintf("%02d",$_[0]->[1]) }
186 8     8 0 54 sub format_q { sprintf("%01d",int($_[0]->[4] / 3) + 1) }
187             sub format_s {
188 6 100   6 0 59 $epoch = timelocal(@{$_[0]}[0..5])
  1         6  
189             unless defined $epoch;
190 6         119 sprintf("%d",$epoch)
191             }
192 190     190 0 1086 sub format_S { sprintf("%02d",$_[0]->[0]) }
193 4     4 0 16 sub format_U { wkyr(0, $_[0]->[6], $_[0]->[7]) }
194 4     4 0 14 sub format_w { $_[0]->[6] }
195 4     4 0 12 sub format_W { wkyr(1, $_[0]->[6], $_[0]->[7]) }
196 23     23 0 126 sub format_y { sprintf("%02d",$_[0]->[5] % 100) }
197 181     181 0 1056 sub format_Y { sprintf("%04d",$_[0]->[5] + 1900) }
198              
199             sub format_Z {
200 159     159 0 304 my $o = tz_local_offset(timelocal(@{$_[0]}[0..5]));
  159         608  
201 159 50       1039 defined $tzname ? $tzname : uc tz_name($o, $_[0]->[8]);
202             }
203              
204             sub format_z {
205 7     7 0 18 my $t = timelocal(@{$_[0]}[0..5]);
  7         38  
206 7 50       436 my $o = defined $tzname ? tz_offset($tzname, $t) : tz_offset(undef,$t);
207 7         59 sprintf("%+03d%02d", int($o / 3600), int(abs($o) % 3600) / 60);
208             }
209              
210 4     4 0 12 sub format_c { &format_x . " " . &format_X }
211 4     4 0 11 sub format_D { &format_m . "/" . &format_d . "/" . &format_y }
212 4     4 0 11 sub format_r { &format_I . ":" . &format_M . ":" . &format_S . " " . &format_p }
213 4     4 0 9 sub format_R { &format_H . ":" . &format_M }
214 174     174 0 408 sub format_T { &format_H . ":" . &format_M . ":" . &format_S }
215 0     0 0 0 sub format_t { "\t" }
216 0     0 0 0 sub format_n { "\n" }
217 2     2 0 15 sub format_o { sprintf("%2d%s",$_[0]->[3],$Dsuf[$_[0]->[3]]) }
218 8     8 0 25 sub format_x { my $f = $format{'x'}; _subs($_[0],$f); }
  8         19  
219 8     8 0 16 sub format_X { my $f = $format{'X'}; _subs($_[0],$f); }
  8         20  
220 4     4 0 10 sub format_C { my $f = $format{'C'}; _subs($_[0],$f); }
  4         14  
221              
222 4     4 0 29 sub format_Od { roman(format_d(@_)) }
223 4     4 0 11 sub format_Oe { roman(format_e(@_)) }
224 4     4 0 13 sub format_OH { roman(format_H(@_)) }
225 4     4 0 12 sub format_OI { roman(format_I(@_)) }
226 4     4 0 12 sub format_Oj { roman(format_j(@_)) }
227 4     4 0 16 sub format_Ok { roman(format_k(@_)) }
228 4     4 0 10 sub format_Ol { roman(format_l(@_)) }
229 4     4 0 10 sub format_Om { roman(format_m(@_)) }
230 4     4 0 14 sub format_OM { roman(format_M(@_)) }
231 4     4 0 13 sub format_Oq { roman(format_q(@_)) }
232 4     4 0 13 sub format_Oy { roman(format_y(@_)) }
233 4     4 0 14 sub format_OY { roman(format_Y(@_)) }
234              
235 3     3 0 19 sub format_G { int(($_[0]->[9] - 315993600) / 604800) }
236              
237             1;
238              
239             __END__