$VERSION
=
'0.08'
;
(
parsers
=>
{
parse_date
=>
{
params
=> [
qw( year month day )
],
regex
=>
qr/^(\d{1,4})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})$/
,
},
parse_datetime
=>
[ {
params
=> [
qw( year month day hour minute second )
],
regex
=>
qr/^(\d{1,4})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})[\sT](\d{1,2})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})$/
,
extra
=> {
time_zone
=>
'floating'
},
},
{
params
=> [
qw( year month day hour minute second microsecond )
],
regex
=>
qr/^(\d{1,4})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})[\sT](\d{1,2})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})\.(\d{1,6})/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_convert_micro_to_nanosecs
,
},
],
parse_timestamp
=>
[ {
params
=> [
qw( year month day hour minute second microsecond )
],
regex
=>
qr/^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)\.(\d{1,6})$/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_convert_micro_to_nanosecs
,
},
{
params
=> [
qw( year month day hour minute second microsecond )
],
regex
=>
qr/^(\d{1,4})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})[\sT](\d{1,2})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})\.(\d{1,6})/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_convert_micro_to_nanosecs
,
},
{
length
=> 14,
params
=> [
qw( year month day hour minute second )
],
regex
=>
qr/^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
},
{
params
=> [
qw( year month day hour minute second )
],
regex
=>
qr/^(\d{1,4})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})[\sT](\d{1,2})[[:punct:]](\d{1,2})[[:punct:]](\d{1,2})$/
,
extra
=> {
time_zone
=>
'floating'
},
},
{
length
=> 12,
params
=> [
qw( year month day hour minute second )
],
regex
=>
qr/^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_fix_2_digit_year
,
},
{
length
=> 10,
params
=> [
qw( year month day hour minute )
],
regex
=>
qr/^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_fix_2_digit_year
,
},
{
length
=> 8,
params
=> [
qw( year month day )
],
regex
=>
qr/^(\d\d\d\d)(\d\d)(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
},
{
length
=> 6,
params
=> [
qw( year month day )
],
regex
=>
qr/^(\d\d)(\d\d)(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_fix_2_digit_year
,
},
{
length
=> 4,
params
=> [
qw( year month )
],
regex
=>
qr/^(\d\d)(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_fix_2_digit_year
,
},
{
length
=> 2,
params
=> [
qw( year )
],
regex
=>
qr/^(\d\d)$/
,
extra
=> {
time_zone
=>
'floating'
},
postprocess
=> \
&_fix_2_digit_year
,
},
],
},
);
sub
_fix_2_digit_year
{
my
%p
=
@_
;
$p
{parsed}{year} +=
$p
{parsed}{year} <= 69 ? 2000 : 1900;
}
sub
format_date
{
my
(
$self
,
$dt
) =
@_
;
return
$dt
->ymd(
'-'
);
}
sub
format_time
{
my
(
$self
,
$dt
) =
@_
;
return
$dt
->microsecond ?
join
(
'.'
,
$dt
->hms(
':'
),
sprintf
(
"%06d"
,
$dt
->microsecond)) :
$dt
->hms(
':'
);
}
sub
format_datetime
{
my
(
$self
,
$dt
) =
@_
;
return
$self
->format_date(
$dt
) .
' '
.
$self
->format_time(
$dt
);
}
sub
_convert_micro_to_nanosecs
{
my
%p
=
@_
;
my
$micro_secs
=
delete
$p
{parsed}{microsecond};
$micro_secs
.=
'0'
x (6 -
length
(
$micro_secs
));
$p
{parsed}{nanosecond} =
$micro_secs
* 1000;
return
1;
}
1;