From 031652afd49583192585b5c6f13f297ef0f06379 Mon Sep 17 00:00:00 2001 From: David Hull Date: Sat, 21 Nov 2015 21:56:04 +0000 Subject: [PATCH] tz-erl: Include month and day in future 'until' check. --- db/tz-erl | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/db/tz-erl b/db/tz-erl index 24e0af1..a5534c3 100755 --- a/db/tz-erl +++ b/db/tz-erl @@ -258,9 +258,13 @@ sub zone_line { # We ignore any zone line that has a definite until (end) time that # is in the past. if (defined $until) { - my $until_year = ($until =~ m/^(\d+)/)[0]; - if ($until_year >= $current_year) { - die "until $until not handled"; + my ($until_year, $until_month, $until_day) = split_ymd($until); + if (($until_year > $current_year) || + (($until_year == $current_year) && + (($until_month > $current_month) || + (($until_month == $current_month) && + ($until_day >= $current_day))))) { + "future until \"$until\" not handled"; } return; } @@ -429,6 +433,23 @@ INIT { %dow_from_name= map { $dow_to_name[$_] => $_ } (0..$#dow_to_name); } +sub split_ymd { + my ($ymd) = @_; + $ymd =~ m/^(\d+)(?:\s+(\w+)(?:\s+(\d+)))?/ + or die "parse \"$ymd\" for ymd failed"; + my $year = $1; + my $month = do { + if (defined $2) { + defined $mon_from_name{$2} or die "parse \"$ymd\" for month failed"; + $mon_from_name{$2}; + } else { + 0 + } + }; + my $day = defined $3 ? $3 : 0; + return ($year, $month, $day); +} + sub on_to_day_of_month { my ($on, $year, $month) = @_;