1use warnings; 2use strict; 3 4use Config; 5use Test::More tests => 135; 6 7require_ok "timelocal.pl"; 8 9foreach( 10 #year,mon,day,hour,min,sec 11 [1950, 4, 12, 9, 30, 31], 12 [1969, 12, 31, 16, 59, 59], 13 [1970, 1, 2, 00, 00, 00], 14 [1980, 2, 28, 12, 00, 00], 15 [1980, 2, 29, 12, 00, 00], 16 [1999, 12, 31, 23, 59, 59], 17 [2000, 1, 1, 00, 00, 00], 18 [2010, 10, 12, 14, 13, 12], 19 [2020, 2, 29, 12, 59, 59], 20 [2030, 7, 4, 17, 07, 06], 21) { 22 my($year, $mon, $mday, $hour, $min, $sec) = @$_; 23 $year -= 1900; 24 $mon--; 25 26 # Test timelocal() 27 { 28 my $year_in = $year < 70 ? $year + 1900 : $year; 29 my $time = &timelocal($sec,$min,$hour,$mday,$mon,$year_in); 30 my($s,$m,$h,$D,$M,$Y) = localtime($time); 31 is $s, $sec, "timelocal second for @$_"; 32 is $m, $min, "timelocal minute for @$_"; 33 is $h, $hour, "timelocal hour for @$_"; 34 is $D, $mday, "timelocal day for @$_"; 35 is $M, $mon, "timelocal month for @$_"; 36 is $Y, $year, "timelocal year for @$_"; 37 } 38 39 # Test timegm() 40 { 41 my $year_in = $year < 70 ? $year + 1900 : $year; 42 my $time = &timegm($sec,$min,$hour,$mday,$mon,$year_in); 43 my($s,$m,$h,$D,$M,$Y) = gmtime($time); 44 is $s, $sec, "timegm second for @$_"; 45 is $m, $min, "timegm minute for @$_"; 46 is $h, $hour, "timegm hour for @$_"; 47 is $D, $mday, "timegm day for @$_"; 48 is $M, $mon, "timegm month for @$_"; 49 is $Y, $year, "timegm year for @$_"; 50 } 51} 52 53 54foreach( 55 # month too large 56 [1995, 13, 01, 01, 01, 01], 57 # day too large 58 [1995, 02, 30, 01, 01, 01], 59 # hour too large 60 [1995, 02, 10, 25, 01, 01], 61 # minute too large 62 [1995, 02, 10, 01, 60, 01], 63 # second too large 64 [1995, 02, 10, 01, 01, 60], 65) { 66 my($year, $mon, $mday, $hour, $min, $sec) = @$_; 67 $year -= 1900; 68 $mon--; 69 eval { &timegm($sec,$min,$hour,$mday,$mon,$year) }; 70 like $@, qr/.*out of range.*/, 'invalid time caused an error'; 71} 72 73is &timelocal(0,0,1,1,0,90) - &timelocal(0,0,0,1,0,90), 3600, 74 'one hour difference between two calls to timelocal'; 75 76is &timelocal(1,2,3,1,0,100) - &timelocal(1,2,3,31,11,99), 24 * 3600, 77 'one day difference between two calls to timelocal'; 78 79# Diff beween Jan 1, 1980 and Mar 1, 1980 = (31 + 29 = 60 days) 80is &timegm(0,0,0, 1, 2, 80) - &timegm(0,0,0, 1, 0, 80), 60 * 24 * 3600, 81 '60 day difference between two calls to timegm'; 82 83# bugid #19393 84# At a DST transition, the clock skips forward, eg from 01:59:59 to 85# 03:00:00. In this case, 02:00:00 is an invalid time, and should be 86# treated like 03:00:00 rather than 01:00:00 - negative zone offsets used 87# to do the latter 88{ 89 my $hour = (localtime(&timelocal(0, 0, 2, 7, 3, 102)))[2]; 90 # testers in US/Pacific should get 3, 91 # other testers should get 2 92 ok $hour == 2 || $hour == 3, 'hour should be 2 or 3'; 93} 94 95eval { &timegm(0,0,0,29,1,1900) }; 96like $@, qr/Day '29' out of range 1\.\.28/, 'does not accept leap day in 1900'; 97 98eval { &timegm(0,0,0,29,1,0) }; 99is $@, '', 'no error with leap day of 2000 (year passed as 0)'; 100 101eval { &timegm(0,0,0,29,1,1904) }; 102is $@, '', 'no error with leap day of 1904'; 103 104eval { &timegm(0,0,0,29,1,4) }; 105is $@, '', 'no error with leap day of 2004 (year passed as 4)'; 106 107eval { &timegm(0,0,0,29,1,96) }; 108is $@, '', 'no error with leap day of 1996 (year passed as 96)'; 109 1101; 111