#!/usr/bin/perl -w
my
$class
;
BEGIN {
$class
=
'DateTime::Format::HTTP'
;
use_ok
$class
;
}
my
$offset
= ($^O eq
"MacOS"
) ? Time::Local::timegm(0,0,0,1,0,70) : 0;
my
(
@tests
) =
(
'Thu, 03 Feb 1994 00:00:00 GMT'
,
'Thursday, 03-Feb-94 00:00:00 GMT'
,
'Thursday, 03-Feb-1994 00:00:00 GMT'
,
'Thu Feb 3 00:00:00 GMT 1994'
,
'Thu Feb 3 00:00:00 1994'
,
'03/Feb/1994:00:00:00 0000'
,
'03/Feb/1994:01:00:00 +0100'
,
'02/Feb/1994:23:00:00 -0100'
,
'03 Feb 1994 00:00:00 GMT'
,
'03-Feb-94 00:00:00 GMT'
,
'03-Feb-1994 00:00:00 GMT'
,
'03-Feb-1994 00:00 GMT'
,
'03-Feb-1994 00:00'
,
'03-Feb-94'
,
'03-Feb-1994'
,
'03 Feb 1994'
,
'03/Feb/1994'
,
'Feb 3 1994'
,
"02-03-94 12:00AM"
,
'1994-02-03 00:00:00 +0000'
,
'1994-02-03'
,
'19940203'
,
'1994-02-03T00:00:00+0000'
,
'1994-02-02T23:00:00-0100'
,
'1994-02-02T23:00:00-01:00'
,
'1994-02-03T00:00:00 Z'
,
'19940203T000000Z'
,
'199402030000'
,
' 03/Feb/1994 '
,
' 03 Feb 1994 0:00 '
,
);
{
my
$time
= (760233600 +
$offset
);
$time
= DateTime->from_epoch(
epoch
=>
$time
);
for
(
@tests
)
{
my
$t
=
$class
->parse_datetime(
$_
, /GMT/i ? () : (
'GMT'
));
my
$t2
=
$class
->parse_datetime(
lc
(
$_
) =>
'GMT'
);
my
$t3
=
$class
->parse_datetime(
uc
(
$_
) =>
'GMT'
);
if
(
$t
->epoch !=
$time
->epoch )
{
diag
"difference is: "
.(
$t
->epoch -
$time
->epoch);
}
is (
$t
->epoch,
$time
->epoch,
"str2time (1): $_"
);
is (
$t2
->epoch,
$time
->epoch,
"str2time (2): $_"
);
is (
$t3
->epoch,
$time
->epoch,
"str2time (3): $_"
);
}
die
"time2str failed"
unless
$class
->format_datetime(
$time
) eq
'Thu, 03 Feb 1994 00:00:00 GMT'
;
}
{
my
$time
=
int
((
time
- 3 * 24*60*60) /60)*60;
my
(
$min
,
$hr
,
$mday
,
$mon
) = (
gmtime
$time
)[1,2,3,4];
$mon
= (
qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
)[
$mon
];
my
$str
=
sprintf
(
"$mon %02d %02d:%02d"
,
$mday
,
$hr
,
$min
);
my
$t
=
$class
->parse_datetime(
$str
);
is(
$t
->epoch,
$time
);
}
for
(
undef
,
''
,
'Garbage'
,
'Mandag 16. September 1996'
,
'1980-00-01'
,
'1980-13-01'
,
'1980-01-00'
,
'1980-01-32'
,
'1980-01-01 25:00:00'
,
'1980-01-01 00:61:00'
,
)
{
my
$desc
=
defined
$_
?
"'$_'"
:
"undef"
;
$desc
.=
' does not parse'
;
my
$ok
= !
defined
eval
{
$class
->parse_datetime(
$_
) };
ok(
$ok
,
$desc
);
}
my
$conv
=
sub
{
my
$str
=
shift
;
$class
->format_iso(
$class
->parse_datetime(
$str
) );
};
my
$t
;
$t
=
$conv
->(
"11-12-96 0:00AM"
);
is(
$t
=>
"1996-11-12 00:00:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 12:00AM"
);
is(
$t
=>
"1996-11-12 00:00:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 0:00PM"
);
is(
$t
=>
"1996-11-12 12:00:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 12:00PM"
);
is(
$t
=>
"1996-11-12 12:00:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 1:05AM"
);
is(
$t
=>
"1996-11-12 01:05:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 12:05AM"
);
is(
$t
=>
"1996-11-12 00:05:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 1:05PM"
);
is(
$t
=>
"1996-11-12 13:05:00"
,
$t
);
$t
=
$conv
->(
"11-12-96 12:05PM"
);
is(
$t
=>
"1996-11-12 12:05:00"
,
$t
);
my
$dt
=
$class
->parse_datetime(
"2000-01-01 00:00:01.234"
);
$t
=
$dt
->epoch;
ok(
abs
((
$t
-
int
(
$t
)) - 0.234) > 0.000001,
"FRAC $t = "
.
$class
->format_iso(
$dt
)
);
is(
$dt
->microsecond, 234_000,
'.234s == 234_000us'
);
is(
$dt
->nanosecond, 234_000_000,
'.234s == 234_000_000ns'
);
$dt
=
$class
->parse_datetime(
"2010-06-26T15:14:33.400753"
);
$t
=
$dt
->epoch;
ok(
abs
((
$t
-
int
(
$t
)) - 0.400753) > 0.000001,
"FRAC $t = "
.
$class
->format_iso(
$dt
)
);
is(
$dt
->microsecond, 400_753,
'.400753s == 400_753us'
);
is(
$dt
->nanosecond, 400_753_000,
'.400753s == 400_753_000ns'
);
for
my
$ns
(
qw(1 12 123 1234 499999999 500000000 500000001 999753123 999999999)
) {
$dt
=
$class
->parse_datetime(
sprintf
(
"2010-06-26T15:14:33.%09d"
,
$ns
));
is(
$dt
->nanosecond,
$ns
,
".${ns}s == ${ns}ns"
);
}
$a
=
$class
->format_iso( );
$b
=
$class
->format_iso( DateTime->from_epoch(
epoch
=> 500000 ) );
my
$az
=
$class
->format_isoz( );
my
$bz
=
$class
->format_isoz( DateTime->from_epoch(
epoch
=> 500000 ) );
for
(
$a
,
$b
) {
like(
$_
=>
qr/^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d$/
,
"time2iso($_)"
);
}
for
(
$az
,
$bz
) {
like(
$_
=>
qr/^\d{4}-\d\d-\d\d \d\d:\d\d:\d\dZ$/
,
"time2isoz($_)"
);
}
{
my
$eastern_date
= DateTime->new(
year
=> 2010,
month
=> 10,
day
=> 21,
hour
=> 13,
minute
=> 8,
second
=> 23,
time_zone
=>
'America/New_York'
,
);
my
$isoz
=
$class
->format_isoz(
$eastern_date
);
my
$utc
=
$eastern_date
->clone->set_time_zone(
'UTC'
);
is(
$isoz
,
$class
->format_isoz(
$utc
),
'format_isoz converts to UTC time zone'
);
is(
$eastern_date
->time_zone->name,
'America/New_York'
,
'format_isoz does not modify input date\'s time zone'
);
}