# test suite stolen shamelessly from TimeDate distro use strict; use warnings; use utf8; use Test::More; use DateTime; my $locale = 'en_US'; my $dt; my %params; while ( defined( my $line = ) ) { chomp $line; next unless $line =~ /\S/; if ( $line =~ /^year =>/ ) { %params = map { split /\s*=>\s*/ } split /\s*,\s*/, $line; $dt = DateTime->new( %params, time_zone => 'UTC' ); next; } elsif ( $line =~ /^(\w+)/ ) { $locale = $1; eval "use DateTime::Locale::$1"; die $@ if $@; $dt = DateTime->new( %params, time_zone => 'UTC', locale => $locale ); next; } my ( $fmt, $res ) = split /\s+=>\s+/, $line, 2; $res =~ s/^\'|\'$//g; if ( $fmt eq '%A' && $locale eq 'it' && $] >= 5.006 && $] <= 5.008 ) { ok( 1, "Perl 5.6.0 & 5.6.1 cannot handle Unicode characters in the DATA filehandle properly" ); next; } is( $dt->strftime($fmt), $res, "$fmt" ); } # test use of strftime with multiple params - in list and scalar # context { my $dt = DateTime->new( year => 1800, month => 1, day => 10, time_zone => 'UTC', ); my ( $y, $d ) = $dt->strftime( '%Y', '%d' ); is( $y, 1800, 'first value is year' ); is( $d, 10, 'second value is day' ); $y = $dt->strftime( '%Y', '%d' ); is( $y, 1800, 'scalar context returns year' ); } { my $dt = DateTime->new( year => 2003, hour => 0, minute => 0 ); is( $dt->strftime('%I %M %p'), '12 00 AM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), '12 00 AM', 'formatting of hours as 1-12' ); $dt->set( hour => 1 ); is( $dt->strftime('%I %M %p'), '01 00 AM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), ' 1 00 AM', 'formatting of hours as 1-12' ); $dt->set( hour => 11 ); is( $dt->strftime('%I %M %p'), '11 00 AM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), '11 00 AM', 'formatting of hours as 1-12' ); $dt->set( hour => 12 ); is( $dt->strftime('%I %M %p'), '12 00 PM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), '12 00 PM', 'formatting of hours as 1-12' ); $dt->set( hour => 13 ); is( $dt->strftime('%I %M %p'), '01 00 PM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), ' 1 00 PM', 'formatting of hours as 1-12' ); $dt->set( hour => 23 ); is( $dt->strftime('%I %M %p'), '11 00 PM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), '11 00 PM', 'formatting of hours as 1-12' ); $dt->set( hour => 0 ); is( $dt->strftime('%I %M %p'), '12 00 AM', 'formatting of hours as 1-12' ); is( $dt->strftime('%l %M %p'), '12 00 AM', 'formatting of hours as 1-12' ); } { is( DateTime->new( year => 2003, month => 1, day => 1 )->strftime('%V'), '01', '%V is 01' ); } { my $dt = DateTime->new( year => 2004, month => 8, day => 16, hour => 15, minute => 30, nanosecond => 123456789, locale => 'en', ); # Should print '%{day_name}', prints '30onday'! is( $dt->strftime('%%{day_name}%n'), "%{day_name}\n", '%%{day_name}%n bug' ); # Should print '%6N', prints '123456' is( $dt->strftime('%%6N%n'), "%6N\n", '%%6N%n bug' ); } { # Internally this becomes 119999885 nanoseconds (floating point math is awesome) my $epoch = 1297777805.12; my $dt = DateTime->from_epoch( epoch => $epoch ); my @vals = ( 1, 12, 120, 1200, 12000, 120000, 1200000, 12000000, 120000000, 1200000000, ); my $x = 1; for my $val (@vals) { my $spec = '%' . $x++ . 'N'; is( $dt->strftime($spec), $val, "strftime($spec) for $epoch == $val" ); } } { my $dt = DateTime->new( year => 2011 ); for my $i (1..9) { my $spec = '%' . $i . 'N'; my $expect = '0' x$i; is( $dt->strftime($spec), $expect, "strftime $spec with 0 nanoseconds" ); } } done_testing(); # add these if we do roman-numeral stuff # %Od VII # %Oe VII # %OH XIII # %OI I # %Oj CCL # %Ok XIII # %Ol I # %Om IX # %OM II # %Oq III # %OY MCMXCIX # %Oy XCIX __DATA__ year => 1999, month => 9, day => 7, hour => 13, minute => 2, second => 42, nanosecond => 123456789 %y => '99' %Y => '1999' %% => '%' %a => 'Tue' %A => 'Tuesday' %b => 'Sep' %B => 'September' %C => '19' %d => '07' %e => ' 7' %D => '09/07/99' %h => 'Sep' %H => '13' %I => '01' %j => '250' %k => '13' %l => ' 1' %m => '09' %M => '02' %N => '123456789' %3N => '123' %6N => '123457' %10N => '1234567890' %p => 'PM' %r => '01:02:42 PM' %R => '13:02' %s => '936709362' %S => '42' %T => '13:02:42' %U => '36' %V => '36' %w => '2' %W => '36' %y => '99' %Y => '1999' %Z => 'UTC' %z => '+0000' %E => '%E' %{foobar} => '%{foobar}' %{month} => '9' %{year} => '1999' %x => 'Sep 7, 1999' %X => '1:02:42 PM' %c => 'Sep 7, 1999 1:02:42 PM' de %y => '99' %Y => '1999' %% => '%' %a => 'Di.' %A => 'Dienstag' %b => 'Sep' %B => 'September' %C => '19' %d => '07' %e => ' 7' %D => '09/07/99' %h => 'Sep' %H => '13' %I => '01' %j => '250' %k => '13' %l => ' 1' %m => '09' %M => '02' %p => 'nachm.' %r => '01:02:42 nachm.' %R => '13:02' %s => '936709362' %S => '42' %T => '13:02:42' %U => '36' %V => '36' %w => '2' %W => '36' %y => '99' %Y => '1999' %Z => 'UTC' %z => '+0000' %{month} => '9' %{year} => '1999' it %y => '99' %Y => '1999' %% => '%' %a => 'mar' %A => 'martedì' %b => 'set' %B => 'settembre' %C => '19' %d => '07' %e => ' 7' %D => '09/07/99' %h => 'set' %H => '13' %I => '01' %j => '250' %k => '13' %l => ' 1' %m => '09' %M => '02' %p => 'p.' %r => '01:02:42 p.' %R => '13:02' %s => '936709362' %S => '42' %T => '13:02:42' %U => '36' %V => '36' %w => '2' %W => '36' %y => '99' %Y => '1999' %Z => 'UTC' %z => '+0000' %{month} => '9' %{year} => '1999' year => 2012, month => 1, day => 1 %U => '01' %W => '00' year => 2012, month => 1, day => 10 %U => '02' %W => '02' year => 1999, month => 9, day => 7, hour => 13, minute => 2, second => 42, nanosecond => 00012345678 %N => '012345678' %3N => '012' %6N => '012346' %10N => '0123456780'