@@ -15,6 +15,7 @@ our @EXPORT = qw(
15
15
getCanonicalConstant
16
16
getCanonicalMemory
17
17
getCanonicalCount
18
+ getCanonicalDate
18
19
isInteger
19
20
getRegexpOidMatch
20
21
) ;
@@ -150,6 +151,63 @@ sub getRegexpOidMatch {
150
151
return qr / ^$match / ;
151
152
}
152
153
154
+ my %M = qw( Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 Aug 8 Sep 9 Oct 10 Nov 11 Dec 12) ;
155
+ my $months = join (' |' , keys (%M ));
156
+ my $days = " Mon|Tue|Wed|Thu|Fri|Sat|Sun" ;
157
+ my $first = join (" |" , map { " 0?$_ " } 1..9);
158
+ my $month = join (" |" , $first , 10..12);
159
+ my $month2 = join (" |" , map { sprintf (" %02d" , $_ ) } 1..12);
160
+ my $day = join (" |" , $first , 10..31);
161
+ my $day2 = join (" |" , map { sprintf (" %02d" , $_ ) } 1..31);
162
+ my $hour = join (" |" , map { sprintf (" %02d" , $_ ) } 0..23);
163
+ my $min = join (" |" , map { sprintf (" %02d" , $_ ) } 0..59);
164
+ my $sec = $min ;
165
+ my $year = " [1-9][0-9]{3}" ;
166
+
167
+ # Return date if possible
168
+ sub getCanonicalDate {
169
+ my ($value ) = @_ ;
170
+
171
+ return if empty($value );
172
+
173
+ # Match on 'D M d H:i:s Y'
174
+ if ($value =~ / ^(?:$days ) ($months ) +($day ) (?:$hour ):(?:$min ):(?:$sec ) .*($year )$ / ) {
175
+ return sprintf (" %4d-%02d-%02d" , $3 , $M {$1 }, $2 );
176
+ }
177
+
178
+ # Match 'D M d, Y H:i:s' as in "Wed Aug 01, 2012 05:50:43PM"
179
+ if ($value =~ / ^(?:$days ) ($months ) +($day ), ($year ) / ) {
180
+ return sprintf (" %4d-%02d-%02d" , $3 , $M {$1 }, $2 );
181
+ }
182
+
183
+ # Match on 'Y-m-d\TH:i:sZ' and others with same prefix
184
+ if ($value =~ / ^($year )-($month )-($day )/ ) {
185
+ return sprintf (" %4d-%02d-%02d" , $1 , $2 , $3 );
186
+ }
187
+
188
+ # Match on 'd/m/Y H:i:s' and others
189
+ if ($value =~ m { ^($day )/($month )/($year )} ) {
190
+ return sprintf (" %4d-%02d-%02d" , $3 , $2 , $1 );
191
+ }
192
+
193
+ # Match on 'm/d/Y'
194
+ if ($value =~ m { ^($month )/($day )/($year )} ) {
195
+ return sprintf (" %4d-%02d-%02d" , $3 , $1 , $2 );
196
+ }
197
+
198
+ # Match on 'd.m.Y'
199
+ if ($value =~ / ^($day )\. ($month )\. ($year )/ ) {
200
+ return sprintf (" %4d-%02d-%02d" , $3 , $2 , $1 );
201
+ }
202
+
203
+ # Match on 'Ymd'
204
+ if ($value =~ / ^($year )($month2 )($day2 )$ / ) {
205
+ return sprintf (" %4d-%02d-%02d" , $1 , $2 , $3 );
206
+ }
207
+
208
+ return ;
209
+ }
210
+
153
211
1;
154
212
__END__
155
213
0 commit comments