use integer;
use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK );
-$VERSION = '1.15';
+$VERSION = '1.16';
@ISA = qw( Exporter );
@EXPORT = qw( timegm timelocal );
sub timegm {
my ( $sec, $min, $hour, $mday, $month, $year ) = @_;
- # Need to check leap year before altering the value
- my $leap_year = _is_leap_year($year);
-
if ( $year >= 1000 ) {
$year -= 1900;
}
my $md = $MonthDays[$month];
++$md
- if $month == 1 && $leap_year;
+ if $month == 1 && _is_leap_year( $year + 1900 );
croak "Day '$mday' out of range 1..$md" if $mday > $md or $mday < 1;
croak "Hour '$hour' out of range 0..23" if $hour > 23 or $hour < 0;
$tests += @neg_time * 12;
$tests += @bad_time;
$tests += @years;
-$tests += 5;
+$tests += 10;
$tests += 2 if $ENV{PERL_CORE};
$tests += 8 if $ENV{MAINTAINER};
skip 'this platform does not support negative epochs.', 1
unless $neg_epoch_ok;
+ eval { timegm(0,0,0,29,1,1900) };
+ like($@, qr/Day '29' out of range 1\.\.28/,
+ 'does not accept leap day in 1900');
+
+ eval { timegm(0,0,0,29,1,200) };
+ like($@, qr/Day '29' out of range 1\.\.28/,
+ 'does not accept leap day in 2100 (year passed as 200)');
+
+ eval { timegm(0,0,0,29,1,0) };
+ is($@, '', 'no error with leap day of 2000 (year passed as 0)');
+
eval { timegm(0,0,0,29,1,1904) };
is($@, '', 'no error with leap day of 1904');
+
+ eval { timegm(0,0,0,29,1,4) };
+ is($@, '', 'no error with leap day of 2004 (year passed as 4)');
+
+ eval { timegm(0,0,0,29,1,96) };
+ is($@, '', 'no error with leap day of 1996 (year passed as 96)');
}
if ($ENV{MAINTAINER}) {