| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Labyrinth::DTUtils; |
|
2
|
|
|
|
|
|
|
|
|
3
|
7
|
|
|
7
|
|
15849
|
use warnings; |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
219
|
|
|
4
|
7
|
|
|
7
|
|
24
|
use strict; |
|
|
7
|
|
|
|
|
8
|
|
|
|
7
|
|
|
|
|
188
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
7
|
|
|
7
|
|
22
|
use vars qw($VERSION @ISA %EXPORT_TAGS @EXPORT @EXPORT_OK); |
|
|
7
|
|
|
|
|
7
|
|
|
|
7
|
|
|
|
|
797
|
|
|
7
|
|
|
|
|
|
|
$VERSION = '5.31'; |
|
8
|
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
=head1 NAME |
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
Labyrinth::DTUtils - Date & Time Utilities for Labyrinth |
|
12
|
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
use Labyrinth::DTUtils; |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
=head1 DESCRIPTION |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
Various date & time utilities. |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
=head1 EXPORT |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
everything |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
=cut |
|
26
|
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
# ------------------------------------- |
|
28
|
|
|
|
|
|
|
# Export Details |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
require Exporter; |
|
31
|
|
|
|
|
|
|
@ISA = qw(Exporter); |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
%EXPORT_TAGS = ( |
|
34
|
|
|
|
|
|
|
'all' => [ qw( |
|
35
|
|
|
|
|
|
|
DaySelect MonthSelect YearSelect PeriodSelect |
|
36
|
|
|
|
|
|
|
formatDate unformatDate isMonth |
|
37
|
|
|
|
|
|
|
) ] |
|
38
|
|
|
|
|
|
|
); |
|
39
|
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); |
|
41
|
|
|
|
|
|
|
@EXPORT = ( @{ $EXPORT_TAGS{'all'} } ); |
|
42
|
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
############################################################################# |
|
44
|
|
|
|
|
|
|
#Libraries |
|
45
|
|
|
|
|
|
|
############################################################################# |
|
46
|
|
|
|
|
|
|
|
|
47
|
7
|
|
|
7
|
|
5487
|
use DateTime; |
|
|
7
|
|
|
|
|
739917
|
|
|
|
7
|
|
|
|
|
244
|
|
|
48
|
7
|
|
|
7
|
|
3492
|
use Time::Local; |
|
|
7
|
|
|
|
|
9148
|
|
|
|
7
|
|
|
|
|
388
|
|
|
49
|
7
|
|
|
7
|
|
360
|
use Labyrinth::Audit; |
|
|
7
|
|
|
|
|
14
|
|
|
|
7
|
|
|
|
|
999
|
|
|
50
|
7
|
|
|
7
|
|
3510
|
use Labyrinth::MLUtils; |
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
use Labyrinth::Variables; |
|
52
|
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
############################################################################# |
|
54
|
|
|
|
|
|
|
#Variables |
|
55
|
|
|
|
|
|
|
############################################################################# |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
my @months = ( |
|
58
|
|
|
|
|
|
|
{ 'id' => 1, 'value' => "January", }, |
|
59
|
|
|
|
|
|
|
{ 'id' => 2, 'value' => "February", }, |
|
60
|
|
|
|
|
|
|
{ 'id' => 3, 'value' => "March", }, |
|
61
|
|
|
|
|
|
|
{ 'id' => 4, 'value' => "April", }, |
|
62
|
|
|
|
|
|
|
{ 'id' => 5, 'value' => "May", }, |
|
63
|
|
|
|
|
|
|
{ 'id' => 6, 'value' => "June", }, |
|
64
|
|
|
|
|
|
|
{ 'id' => 7, 'value' => "July", }, |
|
65
|
|
|
|
|
|
|
{ 'id' => 8, 'value' => "August", }, |
|
66
|
|
|
|
|
|
|
{ 'id' => 9, 'value' => "September", }, |
|
67
|
|
|
|
|
|
|
{ 'id' => 10, 'value' => "October", }, |
|
68
|
|
|
|
|
|
|
{ 'id' => 11, 'value' => "November", }, |
|
69
|
|
|
|
|
|
|
{ 'id' => 12, 'value' => "December" }, |
|
70
|
|
|
|
|
|
|
); |
|
71
|
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
my @dotw = ( "Sunday", "Monday", "Tuesday", "Wednesday", |
|
73
|
|
|
|
|
|
|
"Thursday", "Friday", "Saturday" ); |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
my @days = map {{'id'=>$_,'value'=> $_}} (1..31); |
|
76
|
|
|
|
|
|
|
my @periods = ( |
|
77
|
|
|
|
|
|
|
{act => 'evnt-month', value => 'Month'}, |
|
78
|
|
|
|
|
|
|
{act => 'evnt-week', value => 'Week'}, |
|
79
|
|
|
|
|
|
|
{act => 'evnt-day', value => 'Day'} |
|
80
|
|
|
|
|
|
|
); |
|
81
|
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
my %formats = ( |
|
83
|
|
|
|
|
|
|
1 => 'YYYY', |
|
84
|
|
|
|
|
|
|
2 => 'MONTH YYYY', |
|
85
|
|
|
|
|
|
|
3 => 'DD/MM/YYYY', |
|
86
|
|
|
|
|
|
|
4 => 'DABV MABV DD TIME24 YYYY', |
|
87
|
|
|
|
|
|
|
5 => 'DAY, DD MONTH YYYY', |
|
88
|
|
|
|
|
|
|
6 => 'DAY, DDEXT MONTH YYYY', |
|
89
|
|
|
|
|
|
|
7 => 'DAY, DD MONTH YYYY (TIME12)', |
|
90
|
|
|
|
|
|
|
8 => 'DAY, DDEXT MONTH YYYY (TIME12)', |
|
91
|
|
|
|
|
|
|
9 => 'YYYY/MM/DD', |
|
92
|
|
|
|
|
|
|
10 => 'DDEXT MONTH YYYY', |
|
93
|
|
|
|
|
|
|
11 => 'YYYYMMDDThhmmss', # iCal date string |
|
94
|
|
|
|
|
|
|
12 => 'YYYY-MM-DDThh:mm:ssZ', # RSS date string |
|
95
|
|
|
|
|
|
|
13 => 'YYYYMMDD', # backwards date |
|
96
|
|
|
|
|
|
|
14 => 'DABV, DDEXT MONTH YYYY', |
|
97
|
|
|
|
|
|
|
15 => 'DD MABV YYYY', |
|
98
|
|
|
|
|
|
|
16 => 'DABV, dd MABV YYYY hh:mm:ss TZ', # RFC-822 date string |
|
99
|
|
|
|
|
|
|
17 => 'DAY, DD MONTH YYYY hh:mm:ss', |
|
100
|
|
|
|
|
|
|
18 => 'DD/MM/YYYY hh:mm:ss', |
|
101
|
|
|
|
|
|
|
19 => 'DDEXT MONTH YYYY', |
|
102
|
|
|
|
|
|
|
20 => 'DABV, DD MABV YYYY hh:mm:ss', |
|
103
|
|
|
|
|
|
|
21 => 'YYYY-MM-DD hh:mm:ss', |
|
104
|
|
|
|
|
|
|
22 => 'YYYYMMDDhhmm', |
|
105
|
|
|
|
|
|
|
); |
|
106
|
|
|
|
|
|
|
|
|
107
|
|
|
|
|
|
|
my %unformats = ( |
|
108
|
|
|
|
|
|
|
11 => '(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})', # iCal date string |
|
109
|
|
|
|
|
|
|
12 => '(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z', # ISO 8601 date string |
|
110
|
|
|
|
|
|
|
13 => '(\d{4})(\d{2})(\d{2})', # backwards date |
|
111
|
|
|
|
|
|
|
22 => '(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})', |
|
112
|
|
|
|
|
|
|
); |
|
113
|
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
# decrees whether the date format above should be UTC |
|
115
|
|
|
|
|
|
|
# time based, or allow for any Summer Time variations. |
|
116
|
|
|
|
|
|
|
my %zonetime = (12 => 1, 16 => 1); |
|
117
|
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
############################################################################# |
|
119
|
|
|
|
|
|
|
#Subroutines |
|
120
|
|
|
|
|
|
|
############################################################################# |
|
121
|
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
=head1 FUNCTIONS |
|
123
|
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
=head2 Dropdown Boxes |
|
125
|
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
=over 4 |
|
127
|
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
=item DaySelect($opt,$blank) |
|
129
|
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
Provides a Day dropdown selection box. |
|
131
|
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
The option $opt allows the given day (numerical 1 - 31) to be the selected |
|
133
|
|
|
|
|
|
|
option in the dropdown. If blank is true, a 'Select Day' option is added as |
|
134
|
|
|
|
|
|
|
the first option to the dropdown. |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
=item MonthSelect($opt,$blank) |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
Provides a Month dropdown selection box. |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
The option $opt allows the given month (numerical 1 - 12) to be the selected |
|
141
|
|
|
|
|
|
|
option in the dropdown. If blank is true, a 'Select Month' option is added as |
|
142
|
|
|
|
|
|
|
the first option to the dropdown. |
|
143
|
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
=item YearSelect($opt,$range,$blank,$dates) |
|
145
|
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
Provides a Year dropdown selection box. |
|
147
|
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
The option $opt allows the given month (numerical 1 - 12) to be the selected |
|
149
|
|
|
|
|
|
|
option in the dropdown. If blank is true, a 'Select Month' option is added as |
|
150
|
|
|
|
|
|
|
the first option to the dropdown. |
|
151
|
|
|
|
|
|
|
|
|
152
|
|
|
|
|
|
|
If is specified, then the following criteria is used: |
|
153
|
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
0 - default |
|
155
|
|
|
|
|
|
|
1 - given dates, see $dates list |
|
156
|
|
|
|
|
|
|
2 - oldest year to current year |
|
157
|
|
|
|
|
|
|
3 - current year to future year |
|
158
|
|
|
|
|
|
|
|
|
159
|
|
|
|
|
|
|
For oldest year, this is determined by the configuration setting |
|
160
|
|
|
|
|
|
|
'year_past_offset' or 'year_past'. For the future year, this is determined by |
|
161
|
|
|
|
|
|
|
the configuration setting 'year_future_offset'. |
|
162
|
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
If the range is set to 1, the list of dates given in the $dates array |
|
164
|
|
|
|
|
|
|
reference will be used. |
|
165
|
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
=item PeriodSelect($opt,$blank) |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
Provides a Period dropdown selection box. |
|
169
|
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
The option $opt allows the given period to be the selected option in the |
|
171
|
|
|
|
|
|
|
dropdown. If blank is true, a 'Select Period' option is added as the first |
|
172
|
|
|
|
|
|
|
option to the dropdown. |
|
173
|
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
Current valid periods are: |
|
175
|
|
|
|
|
|
|
|
|
176
|
|
|
|
|
|
|
opt value |
|
177
|
|
|
|
|
|
|
------------------- |
|
178
|
|
|
|
|
|
|
evnt-month Month |
|
179
|
|
|
|
|
|
|
evnt-week Week |
|
180
|
|
|
|
|
|
|
evnt-day Day |
|
181
|
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
=back |
|
183
|
|
|
|
|
|
|
|
|
184
|
|
|
|
|
|
|
=cut |
|
185
|
|
|
|
|
|
|
|
|
186
|
|
|
|
|
|
|
sub DaySelect { |
|
187
|
|
|
|
|
|
|
my ($opt,$blank) = @_; |
|
188
|
|
|
|
|
|
|
my @list = @days; |
|
189
|
|
|
|
|
|
|
unshift @list, {id=>0,value=>'Select Day'} if(defined $blank && $blank == 1); |
|
190
|
|
|
|
|
|
|
DropDownRows($opt,'day','id','value',@list); |
|
191
|
|
|
|
|
|
|
} |
|
192
|
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
sub MonthSelect { |
|
194
|
|
|
|
|
|
|
my ($opt,$blank) = @_; |
|
195
|
|
|
|
|
|
|
my @list = @months; |
|
196
|
|
|
|
|
|
|
unshift @list, {id=>0,value=>'Select Month'} if(defined $blank && $blank == 1); |
|
197
|
|
|
|
|
|
|
DropDownRows($opt,'month','id','value',@list); |
|
198
|
|
|
|
|
|
|
} |
|
199
|
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
sub YearSelect { |
|
201
|
|
|
|
|
|
|
my ($opt,$range,$blank,$dates) = @_; |
|
202
|
|
|
|
|
|
|
my $year = formatDate(1); |
|
203
|
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
my $past_offset = $settings{year_past_offset} || 0; |
|
205
|
|
|
|
|
|
|
my $future_offset = defined $settings{year_future_offset} ? $settings{year_future_offset} : 4; |
|
206
|
|
|
|
|
|
|
my $past = $past_offset ? $year - $past_offset : $settings{year_past}; |
|
207
|
|
|
|
|
|
|
my $future = $year + $future_offset; |
|
208
|
|
|
|
|
|
|
$past ||= $year; |
|
209
|
|
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
my @range = ($past .. $future); |
|
211
|
|
|
|
|
|
|
if(defined $range) { |
|
212
|
|
|
|
|
|
|
if($range == 1) { @range = @$dates } |
|
213
|
|
|
|
|
|
|
elsif($range == 2) { @range = ($past .. $year) } |
|
214
|
|
|
|
|
|
|
elsif($range == 3) { @range = ($year .. $future) } |
|
215
|
|
|
|
|
|
|
} |
|
216
|
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
my @years = map {{'id'=>$_,'value'=> $_}} @range; |
|
218
|
|
|
|
|
|
|
unshift @years, {id=>0,value=>'Select Year'} if(defined $blank && $blank == 1); |
|
219
|
|
|
|
|
|
|
DropDownRows($opt,'year','id','value',@years); |
|
220
|
|
|
|
|
|
|
} |
|
221
|
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
sub PeriodSelect { |
|
223
|
|
|
|
|
|
|
my ($opt,$blank) = @_; |
|
224
|
|
|
|
|
|
|
my @list = @periods; |
|
225
|
|
|
|
|
|
|
unshift @list, {act=>'',value=>'Select Period'} if(defined $blank && $blank == 1); |
|
226
|
|
|
|
|
|
|
DropDownRowsText($opt,'period','act','value',@list); |
|
227
|
|
|
|
|
|
|
} |
|
228
|
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
## ------------------------------------ |
|
230
|
|
|
|
|
|
|
## Date Functions |
|
231
|
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
=head2 Date Formatting |
|
233
|
|
|
|
|
|
|
|
|
234
|
|
|
|
|
|
|
=over 4 |
|
235
|
|
|
|
|
|
|
|
|
236
|
|
|
|
|
|
|
=item formatDate |
|
237
|
|
|
|
|
|
|
|
|
238
|
|
|
|
|
|
|
=item unformatDate |
|
239
|
|
|
|
|
|
|
|
|
240
|
|
|
|
|
|
|
=item isMonth |
|
241
|
|
|
|
|
|
|
|
|
242
|
|
|
|
|
|
|
=back |
|
243
|
|
|
|
|
|
|
|
|
244
|
|
|
|
|
|
|
=cut |
|
245
|
|
|
|
|
|
|
|
|
246
|
|
|
|
|
|
|
sub formatDate { |
|
247
|
|
|
|
|
|
|
my ($format,$time) = @_; |
|
248
|
|
|
|
|
|
|
my $now = $time ? 0 : 1; |
|
249
|
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
my $dt; |
|
251
|
|
|
|
|
|
|
my $timezone = $settings{timezone} || 'Europe/London'; |
|
252
|
|
|
|
|
|
|
if($time) { |
|
253
|
|
|
|
|
|
|
$dt = DateTime->from_epoch( epoch => $time, time_zone => $timezone ); |
|
254
|
|
|
|
|
|
|
} else { |
|
255
|
|
|
|
|
|
|
$dt = DateTime->now( time_zone => $timezone ); |
|
256
|
|
|
|
|
|
|
} |
|
257
|
|
|
|
|
|
|
|
|
258
|
|
|
|
|
|
|
return $dt->epoch unless($format); |
|
259
|
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
#LogDebug("formatDate format=$format, time=".$dt->epoch); |
|
261
|
|
|
|
|
|
|
|
|
262
|
|
|
|
|
|
|
# create date mini strings |
|
263
|
|
|
|
|
|
|
my $fmonth = $dt->month_name; |
|
264
|
|
|
|
|
|
|
my $amonth = $dt->month_abbr; |
|
265
|
|
|
|
|
|
|
my $fdotw = $dt->day_name; |
|
266
|
|
|
|
|
|
|
my $adotw = $dt->day_abbr; |
|
267
|
|
|
|
|
|
|
my $fsday = sprintf "%d", $dt->day; # short form, ie 6 |
|
268
|
|
|
|
|
|
|
my $fday = sprintf "%02d", $dt->day; # long form, ie 06 |
|
269
|
|
|
|
|
|
|
my $fmon = sprintf "%02d", $dt->month; |
|
270
|
|
|
|
|
|
|
my $fyear = sprintf "%04d", $dt->year; |
|
271
|
|
|
|
|
|
|
my $fddext = sprintf "%d%s", $dt->day, _ext($dt->day); |
|
272
|
|
|
|
|
|
|
my $time12 = sprintf "%d:%02d%s", $dt->hour_12, $dt->minute, lc $dt->am_or_pm; |
|
273
|
|
|
|
|
|
|
my $time24 = sprintf "%d:%02d:%02d", $dt->hour, $dt->minute, $dt->second; |
|
274
|
|
|
|
|
|
|
my $fhour = sprintf "%02d", $dt->hour; |
|
275
|
|
|
|
|
|
|
my $fminute = sprintf "%02d", $dt->minute; |
|
276
|
|
|
|
|
|
|
my $fsecond = sprintf "%02d", $dt->second; |
|
277
|
|
|
|
|
|
|
my $tz = 'UTC'; |
|
278
|
|
|
|
|
|
|
eval { $tz = $dt->time_zone->short_name_for_datetime }; |
|
279
|
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
my $fmt = $formats{$format}; |
|
281
|
|
|
|
|
|
|
|
|
282
|
|
|
|
|
|
|
# transpose format string into a date string |
|
283
|
|
|
|
|
|
|
$fmt =~ s/hh/$fhour/; |
|
284
|
|
|
|
|
|
|
$fmt =~ s/mm/$fminute/; |
|
285
|
|
|
|
|
|
|
$fmt =~ s/ss/$fsecond/; |
|
286
|
|
|
|
|
|
|
$fmt =~ s/DMY/$fday-$fmon-$fyear/; |
|
287
|
|
|
|
|
|
|
$fmt =~ s/MDY/$fmon-$fday-$fyear/; |
|
288
|
|
|
|
|
|
|
$fmt =~ s/YMD/$fyear-$fmon-$fday/; |
|
289
|
|
|
|
|
|
|
$fmt =~ s/MABV/$amonth/; |
|
290
|
|
|
|
|
|
|
$fmt =~ s/DABV/$adotw/; |
|
291
|
|
|
|
|
|
|
$fmt =~ s/MONTH/$fmonth/; |
|
292
|
|
|
|
|
|
|
$fmt =~ s/DAY/$fdotw/; |
|
293
|
|
|
|
|
|
|
$fmt =~ s/DDEXT/$fddext/; |
|
294
|
|
|
|
|
|
|
$fmt =~ s/YYYY/$fyear/; |
|
295
|
|
|
|
|
|
|
$fmt =~ s/MM/$fmon/; |
|
296
|
|
|
|
|
|
|
$fmt =~ s/DD/$fday/; |
|
297
|
|
|
|
|
|
|
$fmt =~ s/dd/$fsday/; |
|
298
|
|
|
|
|
|
|
$fmt =~ s/TIME12/$time12/; |
|
299
|
|
|
|
|
|
|
$fmt =~ s/TIME24/$time24/; |
|
300
|
|
|
|
|
|
|
$fmt =~ s/TZ/$tz/; |
|
301
|
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
return $fmt; |
|
303
|
|
|
|
|
|
|
} |
|
304
|
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
sub unformatDate { |
|
306
|
|
|
|
|
|
|
my ($format,$time) = @_; |
|
307
|
|
|
|
|
|
|
|
|
308
|
|
|
|
|
|
|
return time unless($format && $time); |
|
309
|
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
my (@fields,@values); |
|
311
|
|
|
|
|
|
|
my @basic = qw(ss mm hh DD MM YYYY); |
|
312
|
|
|
|
|
|
|
my %forms = map {$_ => 0 } @basic, 'dd'; |
|
313
|
|
|
|
|
|
|
|
|
314
|
|
|
|
|
|
|
if($unformats{$format}) { |
|
315
|
|
|
|
|
|
|
@fields = reverse @basic; |
|
316
|
|
|
|
|
|
|
@values = $time =~ /$unformats{$format}/; |
|
317
|
|
|
|
|
|
|
} else { |
|
318
|
|
|
|
|
|
|
my $pattern = $formats{$format}; |
|
319
|
|
|
|
|
|
|
$pattern =~ s!TIME24!hh::mm:ss!; |
|
320
|
|
|
|
|
|
|
$pattern =~ s!TIME12!hh::ampm!; |
|
321
|
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
@fields = split(qr![ ,/:()-]+!,$pattern); |
|
323
|
|
|
|
|
|
|
@values = split(qr![ ,/:()-]+!,$time); |
|
324
|
|
|
|
|
|
|
} |
|
325
|
|
|
|
|
|
|
|
|
326
|
|
|
|
|
|
|
@forms{@fields} = @values; |
|
327
|
|
|
|
|
|
|
$forms{$_} = int($forms{$_}||0) for(@basic); |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
#use Data::Dumper; |
|
330
|
|
|
|
|
|
|
#LogDebug("format=[$format], time=[$time]"); |
|
331
|
|
|
|
|
|
|
#LogDebug("fields=[@fields], values=[@values]"); |
|
332
|
|
|
|
|
|
|
#LogDebug("before=".Dumper(\%forms)); |
|
333
|
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
($forms{DD}) = $forms{dd} =~ /(\d+)/ if($forms{dd}); |
|
335
|
|
|
|
|
|
|
($forms{DD}) = $forms{DDEXT} =~ /(\d+)/ if($forms{DDEXT}); |
|
336
|
|
|
|
|
|
|
$forms{MM} = isMonth($forms{MONTH}) if($forms{MONTH}); |
|
337
|
|
|
|
|
|
|
$forms{MM} = isMonth($forms{MABV}) if($forms{MABV}); |
|
338
|
|
|
|
|
|
|
($forms{mm},$forms{AMPM}) = ($forms{ampm} =~ /(\d+)(am|pm)/) if($forms{ampm}); |
|
339
|
|
|
|
|
|
|
$forms{hh}+=12 if($forms{AMPM} && $forms{AMPM} eq 'pm'); |
|
340
|
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
@values = map {$forms{$_}||0} @basic; |
|
342
|
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
my $timezone = $settings{timezone} || 'Europe/London'; |
|
344
|
|
|
|
|
|
|
my $dt = DateTime->new( |
|
345
|
|
|
|
|
|
|
year => $values[5], month => $values[4] || 1, day => $values[3] || 1, |
|
346
|
|
|
|
|
|
|
hour => $values[2], minute => $values[1], second => $values[0], |
|
347
|
|
|
|
|
|
|
time_zone => $timezone ); |
|
348
|
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
return $dt->epoch; |
|
350
|
|
|
|
|
|
|
} |
|
351
|
|
|
|
|
|
|
|
|
352
|
|
|
|
|
|
|
sub _ext { |
|
353
|
|
|
|
|
|
|
my $day = shift; |
|
354
|
|
|
|
|
|
|
my $ext = "th"; |
|
355
|
|
|
|
|
|
|
if($day == 1 || $day == 21 || $day == 31) { $ext = "st" } |
|
356
|
|
|
|
|
|
|
elsif($day == 2 || $day == 22) { $ext = "nd" } |
|
357
|
|
|
|
|
|
|
elsif($day == 3 || $day == 23) { $ext = "rd" } |
|
358
|
|
|
|
|
|
|
return $ext; |
|
359
|
|
|
|
|
|
|
} |
|
360
|
|
|
|
|
|
|
|
|
361
|
|
|
|
|
|
|
sub isMonth { |
|
362
|
|
|
|
|
|
|
my $month = shift; |
|
363
|
|
|
|
|
|
|
return (localtime)[4]+1 unless(defined $month && $month); |
|
364
|
|
|
|
|
|
|
|
|
365
|
|
|
|
|
|
|
foreach (@months) { |
|
366
|
|
|
|
|
|
|
return $_->{id} if($_->{value} =~ /$month/); |
|
367
|
|
|
|
|
|
|
return $_->{value} if($month eq $_->{id}); |
|
368
|
|
|
|
|
|
|
} |
|
369
|
|
|
|
|
|
|
return 0; |
|
370
|
|
|
|
|
|
|
} |
|
371
|
|
|
|
|
|
|
|
|
372
|
|
|
|
|
|
|
1; |
|
373
|
|
|
|
|
|
|
|
|
374
|
|
|
|
|
|
|
__END__ |