unix: fix timezone info for timers after the last transition

git-svn-id: trunk@49005 -
(cherry picked from commit 2a61397d37)
This commit is contained in:
ondrej 2021-03-19 08:11:10 +00:00 committed by marcoonthegit
parent 3ce5aa0daa
commit ab9be15686

View File

@ -64,8 +64,22 @@ var
else else
Exit(0); Exit(0);
end; end;
var
timerLoUTC, timerHiUTC: int64;
begin begin
if (num_transitions=0) or (timer<transitions[0]) then if (num_transitions>0) and not timerIsUTC then
begin
timerLoUTC:=timer-types[type_idxs[0]].offset;
timerHiUTC:=timer-types[type_idxs[num_transitions-1]].offset;
end
else
begin
timerLoUTC:=timer;
timerHiUTC:=timer;
end;
if (num_transitions=0) or (timerLoUTC<transitions[0]) then
{ timer is before the first transition }
begin begin
i:=0; i:=0;
while (i<num_types) and (types[i].isdst) do while (i<num_types) and (types[i].isdst) do
@ -77,6 +91,15 @@ begin
trans_end:=high(trans_end); trans_end:=high(trans_end);
end end
else else
if (num_transitions>0) and (timerHiUTC>=transitions[num_transitions-1]) then
{ timer is after the last transition }
begin
i:=type_idxs[num_transitions-1];
trans_start:=transitions[num_transitions-1];
trans_end:=high(trans_end);
end
else
{ timer inbetween }
begin begin
// Use binary search. // Use binary search.
L := 1; L := 1;
@ -410,6 +433,13 @@ var
readdata:=true; readdata:=true;
end; end;
procedure ClearCurrentTZinfo;
var
i:integer;
begin
for i:=low(CurrentTZinfo) to high(CurrentTZinfo) do
CurrentTZinfo[i] := Default(TTZInfo);
end;
begin begin
if fn='' then if fn='' then
fn:='localtime'; fn:='localtime';
@ -422,6 +452,7 @@ begin
tzhead:=default(ttzhead); tzhead:=default(ttzhead);
LockTZInfo; LockTZInfo;
ReadTimezoneFile:=(readheader() and readdata()); ReadTimezoneFile:=(readheader() and readdata());
ClearCurrentTZinfo;
UnlockTZInfo; UnlockTZInfo;
fpclose(f); fpclose(f);
end; end;