our
@EXPORT_OK
=
qw(parseApacheDateTime)
;
my
@WDAY_NAMES
=
qw(Mon Tue Wed Thu Fri Sat Sun)
;
my
@MONTH_NAMES
=
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
;
my
%NUMERIC_MONTH_OF
=
do
{
my
$i
= 1;
map
{
$_
=>
$i
++ }
@MONTH_NAMES
;
};
sub
_a2r {
my
$re
=
join
(
'|'
,
map
{
quotemeta
}
@_
);
return
qr/$re/
;
}
my
$RE_WDAY
= _a2r(
@WDAY_NAMES
);
my
$RE_MONTH
= _a2r(
@MONTH_NAMES
);
my
$RE_DAY
=
qr/0[1-9]|[12][0-9]|3[01]/
;
my
$RE_YEAR
=
qr/\d{4}/
;
my
$RE_2H
=
qr/2[0-3]|[0-1][0-9]/
;
my
$RE_2M
=
qr/[0-5][0-9]/
;
my
$RE_2S
=
$RE_2M
;
my
$RE_TIME
=
qr/($RE_2H):($RE_2M):($RE_2S)/
;
my
$RE_TIMEZONE
=
qr/\S+/
;
my
$RE_AP_ACCESS
=
qr/($RE_DAY)\/
(
$RE_MONTH
)\/(
$RE_YEAR
):
$RE_TIME
(
$RE_TIMEZONE
)/;
my
$RE_AP_ERROR
=
qr/$RE_WDAY ($RE_MONTH) ($RE_DAY) $RE_TIME ($RE_YEAR)/
;
my
$RE_AP_INDEX
=
qr/($RE_DAY)-($RE_MONTH)-($RE_YEAR) $RE_TIME/
;
sub
parseApacheDateTime {
my
$str
=
shift
;
if
(
$str
=~ m/^
$RE_AP_ACCESS
$/o) {
return
(
fromGregorianRollOver($3,
$NUMERIC_MONTH_OF
{$2}, $1),
timeOfDayToTime($4, $5, $6),
parseRFC822TimeZone($7)
);
}
elsif
(
$str
=~ m/^
$RE_AP_ERROR
$/o) {
return
(
fromGregorianRollOver($6,
$NUMERIC_MONTH_OF
{$1}, $2),
timeOfDayToTime($3, $4, $5),
getCurrentTimeZone()
);
}
elsif
(
$str
=~ m/^
$RE_AP_INDEX
$/o) {
return
(
fromGregorianRollOver($3,
$NUMERIC_MONTH_OF
{$2}, $1),
timeOfDayToTime($4, $5, $6),
getCurrentTimeZone()
);
}
else
{
return
;
}
}
1;