Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions t/gh12.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use strict;
use warnings;
use Test::More tests => 3;
use Date::Parse qw(strptime str2time);

# GH#12 / RT#84075: Date::Parse::str2time maps date in 1963 to 2063
# Root cause: str2time passed a 2-digit year to timegm, triggering its 50-year
# sliding window. The fix: strptime extracts the century and returns year as
# offset-from-1900; str2time reconstructs the full 4-digit year before calling
# timegm, bypassing the windowing entirely.
{
my $this_year = 1900 + (gmtime(time))[5];
my $target_year = $this_year - 50;
my $date = "$target_year-01-01 00:00:00 UTC";
my $time = str2time($date);
my $year_parsed_as = 1900 + (gmtime($time))[5];
is($year_parsed_as, $target_year, "GH#12: year $target_year not mapped to future");

# Canonical example from the original bug report (year 1963)
my $t1963 = str2time("1963-12-31 23:59:59 UTC");
my $got1963 = 1900 + (gmtime($t1963))[5];
is($got1963, 1963, "GH#12: 1963-12-31 not mapped to 2063");

# strptime must capture the century for 4-digit years
my @t = strptime("1963-12-31 23:59:59 UTC");
is($t[7], 19, "GH#12: strptime century field is 19 for 1963");
}
Loading