line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Pcore::Util::Date::Strptime; |
2
|
|
|
|
|
|
|
|
3
|
1
|
|
|
1
|
|
1442
|
use Pcore -role, -const; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
6
|
|
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
# %a - the abbreviated weekday name ('Sun') |
6
|
|
|
|
|
|
|
# %A - the full weekday name ('Sunday') |
7
|
|
|
|
|
|
|
# %b - the abbreviated month name ('Jan') |
8
|
|
|
|
|
|
|
# %B - the full month name ('January') |
9
|
|
|
|
|
|
|
# %c - the preferred local date and time representation |
10
|
|
|
|
|
|
|
# %d - day of the month (01..31) |
11
|
|
|
|
|
|
|
# %e - day of the month without leading zeroes (1..31) |
12
|
|
|
|
|
|
|
# %H - hour of the day, 24-hour clock (00..23) |
13
|
|
|
|
|
|
|
# %I - hour of the day, 12-hour clock (01..12) |
14
|
|
|
|
|
|
|
# %j - day of the year (001..366) |
15
|
|
|
|
|
|
|
# %k - hour of the day, 24-hour clock w/o leading zeroes (0..23) |
16
|
|
|
|
|
|
|
# %l - hour of the day, 12-hour clock w/o leading zeroes (1..12) |
17
|
|
|
|
|
|
|
# %m - month of the year (01..12) |
18
|
|
|
|
|
|
|
# %M - minute of the hour (00..59) |
19
|
|
|
|
|
|
|
# %p - meridian indicator ('AM' or 'PM') |
20
|
|
|
|
|
|
|
# %P - meridian indicator ('am' or 'pm') |
21
|
|
|
|
|
|
|
# %S - second of the minute (00..60) |
22
|
|
|
|
|
|
|
# %U - week number of the current year, starting with the first Sunday as the first day of the first week (00..53) |
23
|
|
|
|
|
|
|
# %W - week number of the current year, starting with the first Monday as the first day of the first week (00..53) |
24
|
|
|
|
|
|
|
# %w - day of the week (Sunday is 0, 0..6) |
25
|
|
|
|
|
|
|
# %x - preferred representation for the date alone, no time |
26
|
|
|
|
|
|
|
# %X - preferred representation for the time alone, no date |
27
|
|
|
|
|
|
|
# %y - year without a century (00..99) |
28
|
|
|
|
|
|
|
# %Y - year with century |
29
|
|
|
|
|
|
|
# %Z - time zone name |
30
|
|
|
|
|
|
|
# %z - +/- hhmm or hh:mm |
31
|
|
|
|
|
|
|
# %% - literal '%' character |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
const our $WEEKDAY => [qw[monday tuesday wednesday thursday friday saturday sunday]]; |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
const our $WEEKDAY_ABBR => [qw[mon tue wed thu fri sat sun]]; |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
const our $MONTH => [qw[january february march april may june july august september october november december]]; |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
const our $MONTH_ABBR => [qw[jan feb mar apr may jun jul aug sep oct nov dec]]; |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
const our $MONTH_NUM => { map { $_ => state $i++ + 1 } $MONTH->@* }; |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
const our $MONTH_ABBR_NUM => { map { $_ => state $i++ + 1 } $MONTH_ABBR->@* }; |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
const our $TIMEZONE => { |
46
|
|
|
|
|
|
|
A => '+0100', |
47
|
|
|
|
|
|
|
ACDT => '+1030', |
48
|
|
|
|
|
|
|
ACST => '+0930', |
49
|
|
|
|
|
|
|
ADT => undef, |
50
|
|
|
|
|
|
|
AEDT => '+1100', |
51
|
|
|
|
|
|
|
AES => '+1000', |
52
|
|
|
|
|
|
|
AEST => '+1000', |
53
|
|
|
|
|
|
|
AFT => '+0430', |
54
|
|
|
|
|
|
|
AHDT => '-0900', |
55
|
|
|
|
|
|
|
AHST => '-1000', |
56
|
|
|
|
|
|
|
AKDT => '-0800', |
57
|
|
|
|
|
|
|
AKST => '-0900', |
58
|
|
|
|
|
|
|
AMST => '+0400', |
59
|
|
|
|
|
|
|
AMT => '+0400', |
60
|
|
|
|
|
|
|
ANAST => '+1300', |
61
|
|
|
|
|
|
|
ANAT => '+1200', |
62
|
|
|
|
|
|
|
ART => '-0300', |
63
|
|
|
|
|
|
|
AST => undef, |
64
|
|
|
|
|
|
|
AT => '-0100', |
65
|
|
|
|
|
|
|
AWST => '+0800', |
66
|
|
|
|
|
|
|
AZOST => '+0000', |
67
|
|
|
|
|
|
|
AZOT => '-0100', |
68
|
|
|
|
|
|
|
AZST => '+0500', |
69
|
|
|
|
|
|
|
AZT => '+0400', |
70
|
|
|
|
|
|
|
B => '+0200', |
71
|
|
|
|
|
|
|
BADT => '+0400', |
72
|
|
|
|
|
|
|
BAT => '+0600', |
73
|
|
|
|
|
|
|
BDST => '+0200', |
74
|
|
|
|
|
|
|
BDT => '+0600', |
75
|
|
|
|
|
|
|
BET => '-1100', |
76
|
|
|
|
|
|
|
BNT => '+0800', |
77
|
|
|
|
|
|
|
BORT => '+0800', |
78
|
|
|
|
|
|
|
BOT => '-0400', |
79
|
|
|
|
|
|
|
BRA => '-0300', |
80
|
|
|
|
|
|
|
BST => undef, |
81
|
|
|
|
|
|
|
BT => undef, |
82
|
|
|
|
|
|
|
BTT => '+0600', |
83
|
|
|
|
|
|
|
C => '+0300', |
84
|
|
|
|
|
|
|
CAST => '+0930', |
85
|
|
|
|
|
|
|
CAT => undef, |
86
|
|
|
|
|
|
|
CCT => undef, |
87
|
|
|
|
|
|
|
CDT => undef, |
88
|
|
|
|
|
|
|
CEST => '+0200', |
89
|
|
|
|
|
|
|
CET => '+0100', |
90
|
|
|
|
|
|
|
CETDST => '+0200', |
91
|
|
|
|
|
|
|
CHADT => '+1345', |
92
|
|
|
|
|
|
|
CHAST => '+1245', |
93
|
|
|
|
|
|
|
CKT => '-1000', |
94
|
|
|
|
|
|
|
CLST => '-0300', |
95
|
|
|
|
|
|
|
CLT => '-0400', |
96
|
|
|
|
|
|
|
COT => '-0500', |
97
|
|
|
|
|
|
|
CST => undef, |
98
|
|
|
|
|
|
|
CSUT => '+1030', |
99
|
|
|
|
|
|
|
CUT => '+0000', |
100
|
|
|
|
|
|
|
CVT => '-0100', |
101
|
|
|
|
|
|
|
CXT => '+0700', |
102
|
|
|
|
|
|
|
CHST => '+1000', |
103
|
|
|
|
|
|
|
D => '+0400', |
104
|
|
|
|
|
|
|
DAVT => '+0700', |
105
|
|
|
|
|
|
|
DDUT => '+1000', |
106
|
|
|
|
|
|
|
DNT => '+0100', |
107
|
|
|
|
|
|
|
DST => '+0200', |
108
|
|
|
|
|
|
|
E => '+0500', |
109
|
|
|
|
|
|
|
EASST => '-0500', |
110
|
|
|
|
|
|
|
EAST => undef, |
111
|
|
|
|
|
|
|
EAT => '+0300', |
112
|
|
|
|
|
|
|
ECT => undef, |
113
|
|
|
|
|
|
|
EDT => undef, |
114
|
|
|
|
|
|
|
EEST => '+0300', |
115
|
|
|
|
|
|
|
EET => '+0200', |
116
|
|
|
|
|
|
|
EETDST => '+0300', |
117
|
|
|
|
|
|
|
EGST => '+0000', |
118
|
|
|
|
|
|
|
EGT => '-0100', |
119
|
|
|
|
|
|
|
EMT => '+0100', |
120
|
|
|
|
|
|
|
EST => undef, |
121
|
|
|
|
|
|
|
ESUT => '+1100', |
122
|
|
|
|
|
|
|
F => '+0600', |
123
|
|
|
|
|
|
|
FDT => undef, |
124
|
|
|
|
|
|
|
FJST => '+1300', |
125
|
|
|
|
|
|
|
FJT => '+1200', |
126
|
|
|
|
|
|
|
FKST => '-0300', |
127
|
|
|
|
|
|
|
FKT => '-0400', |
128
|
|
|
|
|
|
|
FST => undef, |
129
|
|
|
|
|
|
|
FWT => '+0100', |
130
|
|
|
|
|
|
|
G => '+0700', |
131
|
|
|
|
|
|
|
GALT => '-0600', |
132
|
|
|
|
|
|
|
GAMT => '-0900', |
133
|
|
|
|
|
|
|
GEST => '+0500', |
134
|
|
|
|
|
|
|
GET => '+0400', |
135
|
|
|
|
|
|
|
GFT => '-0300', |
136
|
|
|
|
|
|
|
GILT => '+1200', |
137
|
|
|
|
|
|
|
GMT => '+0000', |
138
|
|
|
|
|
|
|
GST => undef, |
139
|
|
|
|
|
|
|
GT => '+0000', |
140
|
|
|
|
|
|
|
GYT => '-0400', |
141
|
|
|
|
|
|
|
GZ => '+0000', |
142
|
|
|
|
|
|
|
H => '+0800', |
143
|
|
|
|
|
|
|
HAA => '-0300', |
144
|
|
|
|
|
|
|
HAC => '-0500', |
145
|
|
|
|
|
|
|
HAE => '-0400', |
146
|
|
|
|
|
|
|
HAP => '-0700', |
147
|
|
|
|
|
|
|
HAR => '-0600', |
148
|
|
|
|
|
|
|
HAT => '-0230', |
149
|
|
|
|
|
|
|
HAY => '-0800', |
150
|
|
|
|
|
|
|
HDT => '-0930', |
151
|
|
|
|
|
|
|
HFE => '+0200', |
152
|
|
|
|
|
|
|
HFH => '+0100', |
153
|
|
|
|
|
|
|
HG => '+0000', |
154
|
|
|
|
|
|
|
HKT => '+0800', |
155
|
|
|
|
|
|
|
HL => undef, # 'local', |
156
|
|
|
|
|
|
|
HNA => '-0400', |
157
|
|
|
|
|
|
|
HNC => '-0600', |
158
|
|
|
|
|
|
|
HNE => '-0500', |
159
|
|
|
|
|
|
|
HNP => '-0800', |
160
|
|
|
|
|
|
|
HNR => '-0700', |
161
|
|
|
|
|
|
|
HNT => '-0330', |
162
|
|
|
|
|
|
|
HNY => '-0900', |
163
|
|
|
|
|
|
|
HOE => '+0100', |
164
|
|
|
|
|
|
|
HST => '-1000', |
165
|
|
|
|
|
|
|
I => '+0900', |
166
|
|
|
|
|
|
|
ICT => '+0700', |
167
|
|
|
|
|
|
|
IDLE => '+1200', |
168
|
|
|
|
|
|
|
IDLW => '-1200', |
169
|
|
|
|
|
|
|
IDT => undef, |
170
|
|
|
|
|
|
|
IOT => '+0500', |
171
|
|
|
|
|
|
|
IRDT => '+0430', |
172
|
|
|
|
|
|
|
IRKST => '+0900', |
173
|
|
|
|
|
|
|
IRKT => '+0800', |
174
|
|
|
|
|
|
|
IRST => '+0430', |
175
|
|
|
|
|
|
|
IRT => '+0330', |
176
|
|
|
|
|
|
|
IST => undef, |
177
|
|
|
|
|
|
|
IT => '+0330', |
178
|
|
|
|
|
|
|
ITA => '+0100', |
179
|
|
|
|
|
|
|
JAVT => '+0700', |
180
|
|
|
|
|
|
|
JAYT => '+0900', |
181
|
|
|
|
|
|
|
JST => '+0900', |
182
|
|
|
|
|
|
|
JT => '+0700', |
183
|
|
|
|
|
|
|
K => '+1000', |
184
|
|
|
|
|
|
|
KDT => '+1000', |
185
|
|
|
|
|
|
|
KGST => '+0600', |
186
|
|
|
|
|
|
|
KGT => '+0500', |
187
|
|
|
|
|
|
|
KOST => '+1200', |
188
|
|
|
|
|
|
|
KRAST => '+0800', |
189
|
|
|
|
|
|
|
KRAT => '+0700', |
190
|
|
|
|
|
|
|
KST => '+0900', |
191
|
|
|
|
|
|
|
L => '+1100', |
192
|
|
|
|
|
|
|
LHDT => '+1100', |
193
|
|
|
|
|
|
|
LHST => '+1030', |
194
|
|
|
|
|
|
|
LIGT => '+1000', |
195
|
|
|
|
|
|
|
LINT => '+1400', |
196
|
|
|
|
|
|
|
LKT => '+0600', |
197
|
|
|
|
|
|
|
LST => undef, # 'local', |
198
|
|
|
|
|
|
|
LT => undef, # 'local', |
199
|
|
|
|
|
|
|
M => '+1200', |
200
|
|
|
|
|
|
|
MAGST => '+1200', |
201
|
|
|
|
|
|
|
MAGT => '+1100', |
202
|
|
|
|
|
|
|
MAL => '+0800', |
203
|
|
|
|
|
|
|
MART => '-0930', |
204
|
|
|
|
|
|
|
MAT => '+0300', |
205
|
|
|
|
|
|
|
MAWT => '+0600', |
206
|
|
|
|
|
|
|
MDT => '-0600', |
207
|
|
|
|
|
|
|
MED => '+0200', |
208
|
|
|
|
|
|
|
MEDST => '+0200', |
209
|
|
|
|
|
|
|
MEST => '+0200', |
210
|
|
|
|
|
|
|
MESZ => '+0200', |
211
|
|
|
|
|
|
|
MET => undef, |
212
|
|
|
|
|
|
|
MEWT => '+0100', |
213
|
|
|
|
|
|
|
MEX => '-0600', |
214
|
|
|
|
|
|
|
MEZ => '+0100', |
215
|
|
|
|
|
|
|
MHT => '+1200', |
216
|
|
|
|
|
|
|
MMT => '+0630', |
217
|
|
|
|
|
|
|
MPT => '+1000', |
218
|
|
|
|
|
|
|
MSD => '+0400', |
219
|
|
|
|
|
|
|
MSK => '+0300', |
220
|
|
|
|
|
|
|
MSKS => '+0400', |
221
|
|
|
|
|
|
|
MST => '-0700', |
222
|
|
|
|
|
|
|
MT => '+0830', |
223
|
|
|
|
|
|
|
MUT => '+0400', |
224
|
|
|
|
|
|
|
MVT => '+0500', |
225
|
|
|
|
|
|
|
MYT => '+0800', |
226
|
|
|
|
|
|
|
N => '-0100', |
227
|
|
|
|
|
|
|
NCT => '+1100', |
228
|
|
|
|
|
|
|
NDT => '-0230', |
229
|
|
|
|
|
|
|
NFT => undef, |
230
|
|
|
|
|
|
|
NOR => '+0100', |
231
|
|
|
|
|
|
|
NOVST => '+0700', |
232
|
|
|
|
|
|
|
NOVT => '+0600', |
233
|
|
|
|
|
|
|
NPT => '+0545', |
234
|
|
|
|
|
|
|
NRT => '+1200', |
235
|
|
|
|
|
|
|
NST => undef, |
236
|
|
|
|
|
|
|
NSUT => '+0630', |
237
|
|
|
|
|
|
|
NT => '-1100', |
238
|
|
|
|
|
|
|
NUT => '-1100', |
239
|
|
|
|
|
|
|
NZDT => '+1300', |
240
|
|
|
|
|
|
|
NZST => '+1200', |
241
|
|
|
|
|
|
|
NZT => '+1200', |
242
|
|
|
|
|
|
|
O => '-0200', |
243
|
|
|
|
|
|
|
OESZ => '+0300', |
244
|
|
|
|
|
|
|
OEZ => '+0200', |
245
|
|
|
|
|
|
|
OMSST => '+0700', |
246
|
|
|
|
|
|
|
OMST => '+0600', |
247
|
|
|
|
|
|
|
OZ => undef, # 'local', |
248
|
|
|
|
|
|
|
P => '-0300', |
249
|
|
|
|
|
|
|
PDT => '-0700', |
250
|
|
|
|
|
|
|
PET => '-0500', |
251
|
|
|
|
|
|
|
PETST => '+1300', |
252
|
|
|
|
|
|
|
PETT => '+1200', |
253
|
|
|
|
|
|
|
PGT => '+1000', |
254
|
|
|
|
|
|
|
PHOT => '+1300', |
255
|
|
|
|
|
|
|
PHT => '+0800', |
256
|
|
|
|
|
|
|
PKT => '+0500', |
257
|
|
|
|
|
|
|
PMDT => '-0200', |
258
|
|
|
|
|
|
|
PMT => '-0300', |
259
|
|
|
|
|
|
|
PNT => '-0830', |
260
|
|
|
|
|
|
|
PONT => '+1100', |
261
|
|
|
|
|
|
|
PST => undef, |
262
|
|
|
|
|
|
|
PWT => '+0900', |
263
|
|
|
|
|
|
|
PYST => '-0300', |
264
|
|
|
|
|
|
|
PYT => '-0400', |
265
|
|
|
|
|
|
|
Q => '-0400', |
266
|
|
|
|
|
|
|
R => '-0500', |
267
|
|
|
|
|
|
|
R1T => '+0200', |
268
|
|
|
|
|
|
|
R2T => '+0300', |
269
|
|
|
|
|
|
|
RET => '+0400', |
270
|
|
|
|
|
|
|
ROK => '+0900', |
271
|
|
|
|
|
|
|
S => '-0600', |
272
|
|
|
|
|
|
|
SADT => '+1030', |
273
|
|
|
|
|
|
|
SAST => undef, |
274
|
|
|
|
|
|
|
SBT => '+1100', |
275
|
|
|
|
|
|
|
SCT => '+0400', |
276
|
|
|
|
|
|
|
SET => '+0100', |
277
|
|
|
|
|
|
|
SGT => '+0800', |
278
|
|
|
|
|
|
|
SRT => '-0300', |
279
|
|
|
|
|
|
|
SST => undef, |
280
|
|
|
|
|
|
|
SWT => '+0100', |
281
|
|
|
|
|
|
|
T => '-0700', |
282
|
|
|
|
|
|
|
TFT => '+0500', |
283
|
|
|
|
|
|
|
THA => '+0700', |
284
|
|
|
|
|
|
|
THAT => '-1000', |
285
|
|
|
|
|
|
|
TJT => '+0500', |
286
|
|
|
|
|
|
|
TKT => '-1000', |
287
|
|
|
|
|
|
|
TMT => '+0500', |
288
|
|
|
|
|
|
|
TOT => '+1300', |
289
|
|
|
|
|
|
|
TRUT => '+1000', |
290
|
|
|
|
|
|
|
TST => '+0300', |
291
|
|
|
|
|
|
|
TUC => '+0000', |
292
|
|
|
|
|
|
|
TVT => '+1200', |
293
|
|
|
|
|
|
|
U => '-0800', |
294
|
|
|
|
|
|
|
ULAST => '+0900', |
295
|
|
|
|
|
|
|
ULAT => '+0800', |
296
|
|
|
|
|
|
|
USZ1 => '+0200', |
297
|
|
|
|
|
|
|
USZ1S => '+0300', |
298
|
|
|
|
|
|
|
USZ3 => '+0400', |
299
|
|
|
|
|
|
|
USZ3S => '+0500', |
300
|
|
|
|
|
|
|
USZ4 => '+0500', |
301
|
|
|
|
|
|
|
USZ4S => '+0600', |
302
|
|
|
|
|
|
|
USZ5 => '+0600', |
303
|
|
|
|
|
|
|
USZ5S => '+0700', |
304
|
|
|
|
|
|
|
USZ6 => '+0700', |
305
|
|
|
|
|
|
|
USZ6S => '+0800', |
306
|
|
|
|
|
|
|
USZ7 => '+0800', |
307
|
|
|
|
|
|
|
USZ7S => '+0900', |
308
|
|
|
|
|
|
|
USZ8 => '+0900', |
309
|
|
|
|
|
|
|
USZ8S => '+1000', |
310
|
|
|
|
|
|
|
USZ9 => '+1000', |
311
|
|
|
|
|
|
|
USZ9S => '+1100', |
312
|
|
|
|
|
|
|
UTZ => '-0300', |
313
|
|
|
|
|
|
|
UYT => '-0300', |
314
|
|
|
|
|
|
|
UZ10 => '+1100', |
315
|
|
|
|
|
|
|
UZ10S => '+1200', |
316
|
|
|
|
|
|
|
UZ11 => '+1200', |
317
|
|
|
|
|
|
|
UZ11S => '+1300', |
318
|
|
|
|
|
|
|
UZ12 => '+1200', |
319
|
|
|
|
|
|
|
UZ12S => '+1300', |
320
|
|
|
|
|
|
|
UZT => '+0500', |
321
|
|
|
|
|
|
|
V => '-0900', |
322
|
|
|
|
|
|
|
VET => '-0400', |
323
|
|
|
|
|
|
|
VLAST => '+1100', |
324
|
|
|
|
|
|
|
VLAT => '+1000', |
325
|
|
|
|
|
|
|
VTZ => '-0200', |
326
|
|
|
|
|
|
|
VUT => '+1100', |
327
|
|
|
|
|
|
|
W => '-1000', |
328
|
|
|
|
|
|
|
WAKT => '+1200', |
329
|
|
|
|
|
|
|
WAST => undef, |
330
|
|
|
|
|
|
|
WAT => '+0100', |
331
|
|
|
|
|
|
|
WEST => '+0100', |
332
|
|
|
|
|
|
|
WESZ => '+0100', |
333
|
|
|
|
|
|
|
WET => '+0000', |
334
|
|
|
|
|
|
|
WETDST => '+0100', |
335
|
|
|
|
|
|
|
WEZ => '+0000', |
336
|
|
|
|
|
|
|
WFT => '+1200', |
337
|
|
|
|
|
|
|
WGST => '-0200', |
338
|
|
|
|
|
|
|
WGT => '-0300', |
339
|
|
|
|
|
|
|
WIB => '+0700', |
340
|
|
|
|
|
|
|
WIT => '+0900', |
341
|
|
|
|
|
|
|
WITA => '+0800', |
342
|
|
|
|
|
|
|
WST => undef, |
343
|
|
|
|
|
|
|
WTZ => '-0100', |
344
|
|
|
|
|
|
|
WUT => '+0100', |
345
|
|
|
|
|
|
|
X => '-1100', |
346
|
|
|
|
|
|
|
Y => '-1200', |
347
|
|
|
|
|
|
|
YAKST => '+1000', |
348
|
|
|
|
|
|
|
YAKT => '+0900', |
349
|
|
|
|
|
|
|
YAPT => '+1000', |
350
|
|
|
|
|
|
|
YDT => '-0800', |
351
|
|
|
|
|
|
|
YEKST => '+0600', |
352
|
|
|
|
|
|
|
YEKT => '+0500', |
353
|
|
|
|
|
|
|
YST => '-0900', |
354
|
|
|
|
|
|
|
Z => '+0000', |
355
|
|
|
|
|
|
|
UTC => '+0000', |
356
|
|
|
|
|
|
|
}; |
357
|
|
|
|
|
|
|
|
358
|
|
|
|
|
|
|
const our $OFFSET => { map { $_ => abs $TIMEZONE->{$_} >= 100 ? ( int( abs $TIMEZONE->{$_} / 100 ) * 60 + abs( $TIMEZONE->{$_} ) % 100 ) / ( $TIMEZONE->{$_} < 0 ? -1 : 1 ) : $TIMEZONE->{$_} } grep { defined $TIMEZONE->{$_} } keys $TIMEZONE->%* }; |
359
|
|
|
|
|
|
|
|
360
|
|
|
|
|
|
|
const our $STRPTIME_TOKEN => { |
361
|
|
|
|
|
|
|
a => [ # the abbreviated weekday name ('Sun') |
362
|
|
|
|
|
|
|
'(?i:' . join( q[|], $WEEKDAY_ABBR->@* ) . ')', |
363
|
|
|
|
|
|
|
], |
364
|
|
|
|
|
|
|
A => [ # the full weekday name ('Sunday') |
365
|
|
|
|
|
|
|
'(?i:' . join( q[|], sort $WEEKDAY->@* ) . ')', |
366
|
|
|
|
|
|
|
], |
367
|
|
|
|
|
|
|
b => [ # the abbreviated month name ('Jan') |
368
|
|
|
|
|
|
|
'((?i:' . join( q[|], sort $MONTH_ABBR->@* ) . '))', |
369
|
|
|
|
|
|
|
'\$args{month} = \$MONTH_ABBR_NUM->{lc $1}', |
370
|
|
|
|
|
|
|
], |
371
|
|
|
|
|
|
|
B => [ # the full month name ('January') |
372
|
|
|
|
|
|
|
'((?i:' . join( q[|], sort $MONTH->@* ) . '))', |
373
|
|
|
|
|
|
|
'\$args{month} = \$MONTH_NUM->{lc $1}', |
374
|
|
|
|
|
|
|
], |
375
|
|
|
|
|
|
|
d => [ # day of the month (01..31) |
376
|
|
|
|
|
|
|
'(\d\d)', |
377
|
|
|
|
|
|
|
'\$args{day} = \$1', |
378
|
|
|
|
|
|
|
], |
379
|
|
|
|
|
|
|
e => [ # day of the month without leading zeroes (1..31) |
380
|
|
|
|
|
|
|
'(\d\d?)', |
381
|
|
|
|
|
|
|
'\$args{day} = \$1', |
382
|
|
|
|
|
|
|
], |
383
|
|
|
|
|
|
|
H => [ # hour of the day, 24-hour clock (00..23) |
384
|
|
|
|
|
|
|
'(\d\d)', |
385
|
|
|
|
|
|
|
'\$args{hour} = \$1', |
386
|
|
|
|
|
|
|
], |
387
|
|
|
|
|
|
|
m => [ # month of the year (01..12) |
388
|
|
|
|
|
|
|
'(\d\d?)', |
389
|
|
|
|
|
|
|
'\$args{month} = \$1', |
390
|
|
|
|
|
|
|
], |
391
|
|
|
|
|
|
|
M => [ # minute of the hour (00..59) |
392
|
|
|
|
|
|
|
'(\d\d)', |
393
|
|
|
|
|
|
|
'\$args{minute} = \$1', |
394
|
|
|
|
|
|
|
], |
395
|
|
|
|
|
|
|
S => [ # second of the minute (00..60) |
396
|
|
|
|
|
|
|
'(\d\d)', |
397
|
|
|
|
|
|
|
'\$args{second} = \$1', |
398
|
|
|
|
|
|
|
], |
399
|
|
|
|
|
|
|
y => [ # year without a century (00..99) |
400
|
|
|
|
|
|
|
'(\d\d)', |
401
|
|
|
|
|
|
|
'\$args{year} = \( $1 + ( $1 >= 69 ? 1900 : 2000 ) )', |
402
|
|
|
|
|
|
|
], |
403
|
|
|
|
|
|
|
Y => [ # year with century |
404
|
|
|
|
|
|
|
'(\d\d\d\d)', |
405
|
|
|
|
|
|
|
'\$args{year} = \$1', |
406
|
|
|
|
|
|
|
], |
407
|
|
|
|
|
|
|
Z => [ # time zone name |
408
|
|
|
|
|
|
|
'((?i:' . join( q[|], sort { length $b <=> length $a } grep { defined $OFFSET->{$_} } keys $OFFSET->%* ) . '))', |
409
|
|
|
|
|
|
|
'\$args{offset} = \$OFFSET->{uc $1}', |
410
|
|
|
|
|
|
|
], |
411
|
|
|
|
|
|
|
z => [ # +/-hhmm, +/-hh:mm |
412
|
|
|
|
|
|
|
'([+-])(\d\d):?(\d\d)', |
413
|
|
|
|
|
|
|
'\$args{offset} = \( ($2 * 60 + $3) / ($1 eq q[-] ? -1 : 1) )', |
414
|
|
|
|
|
|
|
], |
415
|
|
|
|
|
|
|
}; |
416
|
|
|
|
|
|
|
|
417
|
|
|
|
|
|
|
our $CACHE = {}; |
418
|
|
|
|
|
|
|
|
419
|
0
|
|
|
0
|
0
|
|
sub from_strptime ( $self, $str, $pattern, $use_cache = 1 ) { |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
420
|
0
|
0
|
0
|
|
|
|
return $CACHE->{$pattern}->($str) if $use_cache and $CACHE->{$pattern}; |
421
|
|
|
|
|
|
|
|
422
|
0
|
|
|
|
|
|
return $self->_strptime_compile_pattern( $pattern, $use_cache )->($str); |
423
|
|
|
|
|
|
|
} |
424
|
|
|
|
|
|
|
|
425
|
0
|
|
|
0
|
0
|
|
sub expand_strptime_re ( $self, $re ) { |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
426
|
0
|
|
|
|
|
|
state $split_re = qr/%([@{[ join q[|], keys $STRPTIME_TOKEN->%* ]}])/sm; |
|
0
|
|
|
|
|
|
|
427
|
|
|
|
|
|
|
|
428
|
0
|
|
|
|
|
|
my $expanded_re; |
429
|
|
|
|
|
|
|
|
430
|
0
|
|
|
|
|
|
for my $token ( split $split_re, $re ) { |
431
|
0
|
0
|
|
|
|
|
if ( !exists $STRPTIME_TOKEN->{$token} ) { |
432
|
0
|
|
|
|
|
|
$expanded_re .= $token; |
433
|
|
|
|
|
|
|
} |
434
|
|
|
|
|
|
|
else { |
435
|
0
|
|
|
|
|
|
state $cache = {}; |
436
|
|
|
|
|
|
|
|
437
|
0
|
|
0
|
|
|
|
$cache->{$token} //= $STRPTIME_TOKEN->{$token}->[0] =~ s/[(](?![?])/(?:/smrg; |
438
|
|
|
|
|
|
|
|
439
|
0
|
|
|
|
|
|
$expanded_re .= $cache->{$token}; |
440
|
|
|
|
|
|
|
} |
441
|
|
|
|
|
|
|
} |
442
|
|
|
|
|
|
|
|
443
|
0
|
|
|
|
|
|
return $expanded_re; |
444
|
|
|
|
|
|
|
} |
445
|
|
|
|
|
|
|
|
446
|
0
|
|
|
0
|
|
|
sub _strptime_compile_pattern ( $self, $pattern, $use_cache = 1 ) { |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
447
|
0
|
|
|
|
|
|
state $split_re = qr/%([@{[ join q[|], keys $STRPTIME_TOKEN->%* ]}])/sm; |
|
0
|
|
|
|
|
|
|
448
|
|
|
|
|
|
|
|
449
|
0
|
0
|
0
|
|
|
|
return $CACHE->{$pattern} if $use_cache and $CACHE->{$pattern}; |
450
|
|
|
|
|
|
|
|
451
|
0
|
|
|
|
|
|
my $re; |
452
|
|
|
|
|
|
|
|
453
|
0
|
|
|
|
|
|
my $match_id = 0; |
454
|
|
|
|
|
|
|
|
455
|
0
|
|
|
|
|
|
my $sub; |
456
|
|
|
|
|
|
|
|
457
|
0
|
|
|
|
|
|
for my $token ( split $split_re, $pattern ) { |
458
|
0
|
0
|
|
|
|
|
if ( !exists $STRPTIME_TOKEN->{$token} ) { |
459
|
0
|
|
|
|
|
|
$re .= $token; |
460
|
|
|
|
|
|
|
} |
461
|
|
|
|
|
|
|
else { |
462
|
0
|
|
|
|
|
|
$re .= $STRPTIME_TOKEN->{$token}->[0]; |
463
|
|
|
|
|
|
|
|
464
|
0
|
0
|
|
|
|
|
if ( $STRPTIME_TOKEN->{$token}->[1] ) { |
465
|
0
|
|
|
|
|
|
my $code = $STRPTIME_TOKEN->{$token}->[1]; |
466
|
|
|
|
|
|
|
|
467
|
0
|
|
|
|
|
|
my $id = 1; |
468
|
|
|
|
|
|
|
|
469
|
0
|
0
|
|
|
|
|
NEXT: if ( $code =~ /\$$id/sm ) { |
470
|
0
|
|
|
|
|
|
$code =~ s/\$$id/\$match[$match_id]/smg; |
471
|
|
|
|
|
|
|
|
472
|
0
|
|
|
|
|
|
$id++; |
473
|
|
|
|
|
|
|
|
474
|
0
|
|
|
|
|
|
$match_id++; |
475
|
|
|
|
|
|
|
|
476
|
0
|
|
|
|
|
|
goto NEXT; |
477
|
|
|
|
|
|
|
} |
478
|
|
|
|
|
|
|
|
479
|
0
|
|
|
|
|
|
$sub .= " $code;$LF"; |
480
|
|
|
|
|
|
|
} |
481
|
|
|
|
|
|
|
} |
482
|
|
|
|
|
|
|
} |
483
|
|
|
|
|
|
|
|
484
|
0
|
|
|
|
|
|
$sub = <<"PERL"; |
485
|
|
|
|
|
|
|
sub ( \$str ) { |
486
|
|
|
|
|
|
|
if ( my \@match = \$str =~ m[$re]sm ) { |
487
|
|
|
|
|
|
|
my \%args; |
488
|
|
|
|
|
|
|
|
489
|
|
|
|
|
|
|
$sub |
490
|
|
|
|
|
|
|
return \$self->new( \%args ); |
491
|
|
|
|
|
|
|
} |
492
|
|
|
|
|
|
|
else { |
493
|
|
|
|
|
|
|
die q[Strftime pattern does not match]; |
494
|
|
|
|
|
|
|
} |
495
|
|
|
|
|
|
|
}; |
496
|
|
|
|
|
|
|
PERL |
497
|
|
|
|
|
|
|
|
498
|
0
|
|
0
|
|
|
|
$sub = eval $sub || die; ## no critic qw[BuiltinFunctions::ProhibitStringyEval] |
499
|
|
|
|
|
|
|
|
500
|
0
|
0
|
|
|
|
|
$CACHE->{$pattern} = $sub if $use_cache; |
501
|
|
|
|
|
|
|
|
502
|
0
|
|
|
|
|
|
return $sub; |
503
|
|
|
|
|
|
|
} |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
1; |
506
|
|
|
|
|
|
|
## -----SOURCE FILTER LOG BEGIN----- |
507
|
|
|
|
|
|
|
## |
508
|
|
|
|
|
|
|
## PerlCritic profile "pcore-script" policy violations: |
509
|
|
|
|
|
|
|
## +------+----------------------+----------------------------------------------------------------------------------------------------------------+ |
510
|
|
|
|
|
|
|
## | Sev. | Lines | Policy | |
511
|
|
|
|
|
|
|
## |======+======================+================================================================================================================| |
512
|
|
|
|
|
|
|
## | 1 | 369, 373, 377, 381, | ValuesAndExpressions::RequireInterpolationOfMetachars - String *may* require interpolation | |
513
|
|
|
|
|
|
|
## | | 385, 389, 393, 397, | | |
514
|
|
|
|
|
|
|
## | | 401, 405, 409, 413 | | |
515
|
|
|
|
|
|
|
## |------+----------------------+----------------------------------------------------------------------------------------------------------------| |
516
|
|
|
|
|
|
|
## | 1 | 408 | BuiltinFunctions::ProhibitReverseSortBlock - Forbid $b before $a in sort blocks | |
517
|
|
|
|
|
|
|
## +------+----------------------+----------------------------------------------------------------------------------------------------------------+ |
518
|
|
|
|
|
|
|
## |
519
|
|
|
|
|
|
|
## -----SOURCE FILTER LOG END----- |
520
|
|
|
|
|
|
|
__END__ |
521
|
|
|
|
|
|
|
=pod |
522
|
|
|
|
|
|
|
|
523
|
|
|
|
|
|
|
=encoding utf8 |
524
|
|
|
|
|
|
|
|
525
|
|
|
|
|
|
|
=head1 NAME |
526
|
|
|
|
|
|
|
|
527
|
|
|
|
|
|
|
Pcore::Util::Date::Strptime |
528
|
|
|
|
|
|
|
|
529
|
|
|
|
|
|
|
=head1 SYNOPSIS |
530
|
|
|
|
|
|
|
|
531
|
|
|
|
|
|
|
=head1 DESCRIPTION |
532
|
|
|
|
|
|
|
|
533
|
|
|
|
|
|
|
=head1 ATTRIBUTES |
534
|
|
|
|
|
|
|
|
535
|
|
|
|
|
|
|
=head1 METHODS |
536
|
|
|
|
|
|
|
|
537
|
|
|
|
|
|
|
=head1 SEE ALSO |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
=cut |