1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
#!perl
use strict;
use warnings;
use DateTime qw( );
use DateTime::Format::RFC3339 qw( );
use Test::More;
my @tests;
my $default_format = 'DateTime::Format::RFC3339';
push @tests, (
[
'UTC',
$default_format,
DateTime->new( year => 2002, month => 7, day => 1, hour => 13, minute => 50, second => 5, time_zone => 'UTC' ),
'2002-07-01T13:50:05Z',
],
[
'Positive offset',
$default_format,
DateTime->new( year => 2002, month => 7, day => 1, hour => 13, minute => 50, second => 5, time_zone => 'Europe/London' ),
'2002-07-01T13:50:05+01:00',
],
[
'Zero offset',
$default_format,
DateTime->new( year => 2002, month => 1, day => 1, hour => 13, minute => 50, second => 5, time_zone => 'Europe/London' ),
'2002-01-01T13:50:05+00:00',
],
[
'Negative offset',
$default_format,
DateTime->new( year => 2002, month => 1, day => 1, hour => 13, minute => 50, second => 5, time_zone => 'America/New_York' ),
'2002-01-01T13:50:05-05:00',
],
[
'Offset with non-integral minutes',
$default_format,
DateTime->new( year => 1880, month => 1, day => 1, hour => 0, minute => 0, second => 0, time_zone => 'America/New_York' ),
'1880-01-01T04:56:02Z',
],
);
my $dt = DateTime->new( year => 2023, month => 12, day => 31, hour => 23, minute => 59, second => 59, time_zone => 'UTC' );
{
my $format = DateTime::Format::RFC3339->new( decimals => undef );
push @tests, (
[
'decimals => undef - No nanoseconds',
$format,
$dt->clone()->set_nanosecond( 0 ),
'2023-12-31T23:59:59Z',
],
[
'decimals => undef - With nanoseconds',
$format,
$dt->clone()->set_nanosecond( 123_000 ),
'2023-12-31T23:59:59.000123000Z',
],
);
}
for my $decimals ( 0 .. 9 ) {
my $format = DateTime::Format::RFC3339->new( decimals => $decimals );
push @tests, (
[
"decimals => $decimals",
$format,
$dt->clone()->set_nanosecond( 987_654_321 ),
( $decimals
? sprintf( '2023-12-31T23:59:59.%sZ', substr( '987654321', 0, $decimals ) )
: '2023-12-31T23:59:59Z'
),
],
);
}
for (
[ "sep => undef", undef, '2023-12-31T23:59:59Z' ],
[ "sep => 'T'", 'T', '2023-12-31T23:59:59Z' ],
[ "sep => ' '", ' ', '2023-12-31 23:59:59Z' ],
) {
my ( $name, $sep, $expected_str ) = @$_;
my $format = DateTime::Format::RFC3339->new( sep => $sep );
push @tests, [ $name, $format, $dt, $expected_str ];
}
plan tests => 0+@tests;
for ( @tests ) {
my ( $name, $format, $dt, $expected_str ) = @$_;
( $dt = $dt->clone )
->set_formatter( $format );
my $actual_str = "$dt";
is( $actual_str, $expected_str, $name );
}
|