Filename | /usr/share/perl5/Date/Parse.pm |
Statements | Executed 37 statements in 2.53ms |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
1 | 1 | 1 | 1.46ms | 1.48ms | gen_parser | Date::Parse::
1 | 1 | 1 | 1.39ms | 1.73ms | BEGIN@12 | Date::Parse::
3 | 3 | 1 | 20µs | 20µs | CORE:sort (opcode) | Date::Parse::
1 | 1 | 1 | 20µs | 24µs | BEGIN@8 | Date::Parse::
1 | 1 | 1 | 15µs | 59µs | BEGIN@10 | Date::Parse::
1 | 1 | 1 | 13µs | 32µs | BEGIN@13 | Date::Parse::
1 | 1 | 1 | 12µs | 82µs | BEGIN@207 | Date::Parse::
1 | 1 | 1 | 11µs | 58µs | BEGIN@9 | Date::Parse::
1 | 1 | 1 | 11µs | 53µs | BEGIN@11 | Date::Parse::
0 | 0 | 0 | 0s | 0s | __ANON__[:263] | Date::Parse::
0 | 0 | 0 | 0s | 0s | __ANON__[:275] | Date::Parse::
0 | 0 | 0 | 0s | 0s | str2time | Date::Parse::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | # Copyright (c) 1995-2009 Graham Barr. This program is free | ||||
2 | # software; you can redistribute it and/or modify it under the same terms | ||||
3 | # as Perl itself. | ||||
4 | |||||
5 | package Date::Parse; | ||||
6 | |||||
7 | 1 | 17µs | require 5.000; | ||
8 | 3 | 30µs | 2 | 29µs | # spent 24µs (20+5) within Date::Parse::BEGIN@8 which was called:
# once (20µs+5µs) by DateTime::Format::DateParse::BEGIN@14 at line 8 # spent 24µs making 1 call to Date::Parse::BEGIN@8
# spent 5µs making 1 call to strict::import |
9 | 3 | 29µs | 2 | 106µs | # spent 58µs (11+47) within Date::Parse::BEGIN@9 which was called:
# once (11µs+47µs) by DateTime::Format::DateParse::BEGIN@14 at line 9 # spent 58µs making 1 call to Date::Parse::BEGIN@9
# spent 47µs making 1 call to vars::import |
10 | 3 | 33µs | 2 | 104µs | # spent 59µs (15+44) within Date::Parse::BEGIN@10 which was called:
# once (15µs+44µs) by DateTime::Format::DateParse::BEGIN@14 at line 10 # spent 59µs making 1 call to Date::Parse::BEGIN@10
# spent 44µs making 1 call to Exporter::import |
11 | 3 | 44µs | 2 | 96µs | # spent 53µs (11+43) within Date::Parse::BEGIN@11 which was called:
# once (11µs+43µs) by DateTime::Format::DateParse::BEGIN@14 at line 11 # spent 53µs making 1 call to Date::Parse::BEGIN@11
# spent 43µs making 1 call to Exporter::import |
12 | 3 | 163µs | 2 | 1.79ms | # spent 1.73ms (1.39+344µs) within Date::Parse::BEGIN@12 which was called:
# once (1.39ms+344µs) by DateTime::Format::DateParse::BEGIN@14 at line 12 # spent 1.73ms making 1 call to Date::Parse::BEGIN@12
# spent 56µs making 1 call to Exporter::import |
13 | 3 | 354µs | 2 | 52µs | # spent 32µs (13+19) within Date::Parse::BEGIN@13 which was called:
# once (13µs+19µs) by DateTime::Format::DateParse::BEGIN@14 at line 13 # spent 32µs making 1 call to Date::Parse::BEGIN@13
# spent 19µs making 1 call to Exporter::import |
14 | |||||
15 | 1 | 8µs | @ISA = qw(Exporter); | ||
16 | 1 | 900ns | @EXPORT = qw(&strtotime &str2time &strptime); | ||
17 | |||||
18 | 1 | 400ns | $VERSION = "2.30"; | ||
19 | |||||
20 | 1 | 8µs | my %month = ( | ||
21 | january => 0, | ||||
22 | february => 1, | ||||
23 | march => 2, | ||||
24 | april => 3, | ||||
25 | may => 4, | ||||
26 | june => 5, | ||||
27 | july => 6, | ||||
28 | august => 7, | ||||
29 | september => 8, | ||||
30 | sept => 8, | ||||
31 | october => 9, | ||||
32 | november => 10, | ||||
33 | december => 11, | ||||
34 | ); | ||||
35 | |||||
36 | 1 | 6µs | my %day = ( | ||
37 | sunday => 0, | ||||
38 | monday => 1, | ||||
39 | tuesday => 2, | ||||
40 | tues => 2, | ||||
41 | wednesday => 3, | ||||
42 | wednes => 3, | ||||
43 | thursday => 4, | ||||
44 | thur => 4, | ||||
45 | thurs => 4, | ||||
46 | friday => 5, | ||||
47 | saturday => 6, | ||||
48 | ); | ||||
49 | |||||
50 | 1 | 17µs | my @suf = (qw(th st nd rd th th th th th th)) x 3; | ||
51 | 1 | 2µs | @suf[11,12,13] = qw(th th th); | ||
52 | |||||
53 | #Abbreviations | ||||
54 | |||||
55 | 1 | 25µs | map { $month{substr($_,0,3)} = $month{$_} } keys %month; | ||
56 | 1 | 13µs | map { $day{substr($_,0,3)} = $day{$_} } keys %day; | ||
57 | |||||
58 | 1 | 6µs | my $strptime = <<'ESQ'; | ||
59 | my %month = map { lc $_ } %$mon_ref; | ||||
60 | my $daypat = join("|", map { lc $_ } reverse sort keys %$day_ref); | ||||
61 | my $monpat = join("|", reverse sort keys %month); | ||||
62 | my $sufpat = join("|", reverse sort map { lc $_ } @$suf_ref); | ||||
63 | |||||
64 | my %ampm = ( | ||||
65 | 'a' => 0, # AM | ||||
66 | 'p' => 12, # PM | ||||
67 | ); | ||||
68 | |||||
69 | my($AM, $PM) = (0,12); | ||||
70 | |||||
71 | sub { | ||||
72 | |||||
73 | my $dtstr = lc shift; | ||||
74 | my $merid = 24; | ||||
75 | |||||
76 | my($year,$month,$day,$hh,$mm,$ss,$zone,$dst,$frac); | ||||
77 | |||||
78 | $zone = tz_offset(shift) if @_; | ||||
79 | |||||
80 | 1 while $dtstr =~ s#\([^\(\)]*\)# #o; | ||||
81 | |||||
82 | $dtstr =~ s#(\A|\n|\Z)# #sog; | ||||
83 | |||||
84 | # ignore day names | ||||
85 | $dtstr =~ s#([\d\w\s])[\.\,]\s#$1 #sog; | ||||
86 | $dtstr =~ s/,/ /g; | ||||
87 | $dtstr =~ s#($daypat)\s*(den\s)?\b# #o; | ||||
88 | # Time: 12:00 or 12:00:00 with optional am/pm | ||||
89 | |||||
90 | return unless $dtstr =~ /\S/; | ||||
91 | |||||
92 | if ($dtstr =~ s/\s(\d{4})([-:]?)(\d\d?)\2(\d\d?)(?:[-Tt ](\d\d?)(?:([-:]?)(\d\d?)(?:\6(\d\d?)(?:[.,](\d+))?)?)?)?(?=\D)/ /) { | ||||
93 | ($year,$month,$day,$hh,$mm,$ss,$frac) = ($1,$3-1,$4,$5,$7,$8,$9); | ||||
94 | } | ||||
95 | |||||
96 | unless (defined $hh) { | ||||
97 | if ($dtstr =~ s#[:\s](\d\d?):(\d\d?)(:(\d\d?)(?:\.\d+)?)?(z)?\s*(?:([ap])\.?m?\.?)?\s# #o) { | ||||
98 | ($hh,$mm,$ss) = ($1,$2,$4); | ||||
99 | $zone = 0 if $5; | ||||
100 | $merid = $ampm{$6} if $6; | ||||
101 | } | ||||
102 | |||||
103 | # Time: 12 am | ||||
104 | |||||
105 | elsif ($dtstr =~ s#\s(\d\d?)\s*([ap])\.?m?\.?\s# #o) { | ||||
106 | ($hh,$mm,$ss) = ($1,0,0); | ||||
107 | $merid = $ampm{$2}; | ||||
108 | } | ||||
109 | } | ||||
110 | |||||
111 | if (defined $hh and $hh <= 12 and $dtstr =~ s# ([ap])\.?m?\.?\s# #o) { | ||||
112 | $merid = $ampm{$1}; | ||||
113 | } | ||||
114 | |||||
115 | |||||
116 | unless (defined $year) { | ||||
117 | # Date: 12-June-96 (using - . or /) | ||||
118 | |||||
119 | if ($dtstr =~ s#\s(\d\d?)([\-\./])($monpat)(\2(\d\d+))?\s# #o) { | ||||
120 | ($month,$day) = ($month{$3},$1); | ||||
121 | $year = $5 if $5; | ||||
122 | } | ||||
123 | |||||
124 | # Date: 12-12-96 (using '-', '.' or '/' ) | ||||
125 | |||||
126 | elsif ($dtstr =~ s#\s(\d+)([\-\./])(\d\d?)(\2(\d+))?\s# #o) { | ||||
127 | ($month,$day) = ($1 - 1,$3); | ||||
128 | |||||
129 | if ($5) { | ||||
130 | $year = $5; | ||||
131 | # Possible match for 1995-01-24 (short mainframe date format); | ||||
132 | ($year,$month,$day) = ($1, $3 - 1, $5) if $month > 12; | ||||
133 | return if length($year) > 2 and $year < 1901; | ||||
134 | } | ||||
135 | } | ||||
136 | elsif ($dtstr =~ s#\s(\d+)\s*($sufpat)?\s*($monpat)# #o) { | ||||
137 | ($month,$day) = ($month{$3},$1); | ||||
138 | } | ||||
139 | elsif ($dtstr =~ s#($monpat)\s*(\d+)\s*($sufpat)?\s# #o) { | ||||
140 | ($month,$day) = ($month{$1},$2); | ||||
141 | } | ||||
142 | elsif ($dtstr =~ s#($monpat)([\/-])(\d+)[\/-]# #o) { | ||||
143 | ($month,$day) = ($month{$1},$3); | ||||
144 | } | ||||
145 | |||||
146 | # Date: 961212 | ||||
147 | |||||
148 | elsif ($dtstr =~ s#\s(\d\d)(\d\d)(\d\d)\s# #o) { | ||||
149 | ($year,$month,$day) = ($1,$2-1,$3); | ||||
150 | } | ||||
151 | |||||
152 | $year = $1 if !defined($year) and $dtstr =~ s#\s(\d{2}(\d{2})?)[\s\.,]# #o; | ||||
153 | |||||
154 | } | ||||
155 | |||||
156 | # Zone | ||||
157 | |||||
158 | $dst = 1 if $dtstr =~ s#\bdst\b##o; | ||||
159 | |||||
160 | if ($dtstr =~ s#\s"?([a-z]{3,4})(dst|\d+[a-z]*|_[a-z]+)?"?\s# #o) { | ||||
161 | $dst = 1 if $2 and $2 eq 'dst'; | ||||
162 | $zone = tz_offset($1); | ||||
163 | return unless defined $zone; | ||||
164 | } | ||||
165 | elsif ($dtstr =~ s#\s([a-z]{3,4})?([\-\+]?)-?(\d\d?):?(\d\d)?(00)?\s# #o) { | ||||
166 | my $m = defined($4) ? "$2$4" : 0; | ||||
167 | my $h = "$2$3"; | ||||
168 | $zone = defined($1) ? tz_offset($1) : 0; | ||||
169 | return unless defined $zone; | ||||
170 | $zone += 60 * ($m + (60 * $h)); | ||||
171 | } | ||||
172 | |||||
173 | if ($dtstr =~ /\S/) { | ||||
174 | # now for some dumb dates | ||||
175 | if ($dtstr =~ s/^\s*(ut?|z)\s*$//) { | ||||
176 | $zone = 0; | ||||
177 | } | ||||
178 | elsif ($dtstr =~ s#\s([a-z]{3,4})?([\-\+]?)-?(\d\d?)(\d\d)?(00)?\s# #o) { | ||||
179 | my $m = defined($4) ? "$2$4" : 0; | ||||
180 | my $h = "$2$3"; | ||||
181 | $zone = defined($1) ? tz_offset($1) : 0; | ||||
182 | return unless defined $zone; | ||||
183 | $zone += 60 * ($m + (60 * $h)); | ||||
184 | } | ||||
185 | |||||
186 | return if $dtstr =~ /\S/o; | ||||
187 | } | ||||
188 | |||||
189 | if (defined $hh) { | ||||
190 | if ($hh == 12) { | ||||
191 | $hh = 0 if $merid == $AM; | ||||
192 | } | ||||
193 | elsif ($merid == $PM) { | ||||
194 | $hh += 12; | ||||
195 | } | ||||
196 | } | ||||
197 | |||||
198 | $year -= 1900 if defined $year && $year > 1900; | ||||
199 | |||||
200 | $zone += 3600 if defined $zone && $dst; | ||||
201 | $ss += "0.$frac" if $frac; | ||||
202 | |||||
203 | return ($ss,$mm,$hh,$day,$month,$year,$zone); | ||||
204 | } | ||||
205 | ESQ | ||||
206 | |||||
207 | 3 | 421µs | 2 | 153µs | # spent 82µs (12+70) within Date::Parse::BEGIN@207 which was called:
# once (12µs+70µs) by DateTime::Format::DateParse::BEGIN@14 at line 207 # spent 82µs making 1 call to Date::Parse::BEGIN@207
# spent 70µs making 1 call to vars::import |
208 | |||||
209 | sub gen_parser | ||||
210 | # spent 1.48ms (1.46+20µs) within Date::Parse::gen_parser which was called:
# once (1.46ms+20µs) by DateTime::Format::DateParse::BEGIN@14 at line 227 | ||||
211 | 1 | 2µs | local($day_ref,$mon_ref,$suf_ref,$obj) = @_; | ||
212 | |||||
213 | 1 | 700ns | if($obj) | ||
214 | { | ||||
215 | my $obj_strptime = $strptime; | ||||
216 | substr($obj_strptime,index($strptime,"sub")+6,0) = <<'ESQ'; | ||||
217 | shift; # package | ||||
218 | ESQ | ||||
219 | my $sub = eval "$obj_strptime" or die $@; | ||||
220 | return $sub; | ||||
221 | } | ||||
222 | |||||
223 | 1 | 1.32ms | eval "$strptime" or die $@; # spent 151µs executing statements in string eval | ||
224 | |||||
225 | } | ||||
226 | |||||
227 | 1 | 7µs | 1 | 1.48ms | *strptime = gen_parser(\%day,\%month,\@suf); # spent 1.48ms making 1 call to Date::Parse::gen_parser |
228 | |||||
229 | sub str2time | ||||
230 | { | ||||
231 | my @t = strptime(@_); | ||||
232 | |||||
233 | return undef | ||||
234 | unless @t; | ||||
235 | |||||
236 | my($ss,$mm,$hh,$day,$month,$year,$zone) = @t; | ||||
237 | my @lt = localtime(time); | ||||
238 | |||||
239 | $hh ||= 0; | ||||
240 | $mm ||= 0; | ||||
241 | $ss ||= 0; | ||||
242 | |||||
243 | my $frac = $ss - int($ss); | ||||
244 | $ss = int $ss; | ||||
245 | |||||
246 | $month = $lt[4] | ||||
247 | unless(defined $month); | ||||
248 | |||||
249 | $day = $lt[3] | ||||
250 | unless(defined $day); | ||||
251 | |||||
252 | $year = ($month > $lt[4]) ? ($lt[5] - 1) : $lt[5] | ||||
253 | unless(defined $year); | ||||
254 | |||||
255 | return undef | ||||
256 | unless($month <= 11 && $day >= 1 && $day <= 31 | ||||
257 | && $hh <= 23 && $mm <= 59 && $ss <= 59); | ||||
258 | |||||
259 | my $result; | ||||
260 | |||||
261 | if (defined $zone) { | ||||
262 | $result = eval { | ||||
263 | local $SIG{__DIE__} = sub {}; # Ick! | ||||
264 | timegm($ss,$mm,$hh,$day,$month,$year); | ||||
265 | }; | ||||
266 | return undef | ||||
267 | if !defined $result | ||||
268 | or $result == -1 | ||||
269 | && join("",$ss,$mm,$hh,$day,$month,$year) | ||||
270 | ne "595923311169"; | ||||
271 | $result -= $zone; | ||||
272 | } | ||||
273 | else { | ||||
274 | $result = eval { | ||||
275 | local $SIG{__DIE__} = sub {}; # Ick! | ||||
276 | timelocal($ss,$mm,$hh,$day,$month,$year); | ||||
277 | }; | ||||
278 | return undef | ||||
279 | if !defined $result | ||||
280 | or $result == -1 | ||||
281 | && join("",$ss,$mm,$hh,$day,$month,$year) | ||||
282 | ne join("",(localtime(-1))[0..5]); | ||||
283 | } | ||||
284 | |||||
285 | return $result + $frac; | ||||
286 | } | ||||
287 | |||||
288 | 1 | 24µs | 1; | ||
289 | |||||
290 | __END__ | ||||
# spent 20µs within Date::Parse::CORE:sort which was called 3 times, avg 7µs/call:
# once (10µs+0s) by Date::Parse::gen_parser at line 2 of (eval 1017)[Date/Parse.pm:223]
# once (6µs+0s) by Date::Parse::gen_parser at line 3 of (eval 1017)[Date/Parse.pm:223]
# once (4µs+0s) by Date::Parse::gen_parser at line 4 of (eval 1017)[Date/Parse.pm:223] |