Yay, ich kann wieder debuggen....
Der Fehler wird vermutlich(=ich bin nicht sicher) von dem Aufruf der Plattformspezifischen Methode
System.Dateutils.TlocalTimezone.GetChangesForYear
ausgelöst.
WIN32 kann 1899
Delphi-Quellcode:
{ Win32 can't handle dates outside this range }
if (AYear <= 1601)
or (AYear > 30827)
then
exit;
POSIX kann 1899 nicht
Delphi-Quellcode:
if (SizeOf(LongInt) = 4) and ((AYear < 1970) or (AYear > 2037)) then
Exit; // Not supported
Bin gerade noch mitten drin... mal sehen ob es das ist...
Also System.Dateutils.TlocalTimezone.GetChangesForYear Fügt einen Record in den LChanges Cache hinzu für 1899
Lchanges ist der Cache für YearlyChanges....was auch immer das heist
Dieser record sollte eigentlich komplett leer sein so wie ich das verstanden habe, ODER?
Leider scheint das nicht der fall zu sein.
Die Funktion GETTYPE findet dann den YearlyChangesRecord doof.
Delphi-Quellcode:
function TLocalTimeZone.GetType(const ADateTime: TDateTime; const AChanges: TYearlyChanges): TLocalTimeType;
function After(const Point: TDateTime): Boolean;
begin
Result := CompareDateTime(ADateTime, Point) >= 0;
end;
function AfterSum(const Point: TDateTime; const Sum: Int64): Boolean;
begin
Result := CompareDateTime(ADateTime, IncSecond(Point, Sum)) >= 0;
end;
function Before(const Point: TDateTime): Boolean;
begin
Result := CompareDateTime(ADateTime, Point) < 0;
end;
function BeforeSum(const Point: TDateTime; const Sum: Int64): Boolean;
begin
Result := CompareDateTime(ADateTime, IncSecond(Point, Sum)) < 0;
end;
var
LDstSave: Int64;
begin
{ Default to normal }
Result := lttStandard;
{ Calculate the save }
LDstSave := (AChanges.FBiasWithDST - AChanges.FBias);//<--- DAS HIER MÜSSTE 0 Ergeben und alles wäre gut ???? Result := lttStandard;
{ Check only if we have a DST bias ... }
if LDstSave <> 0 then///<------------ LEIDER geht das Programm hier rein :(
begin
{ NOTE: Apparently there are Countries that use inverse DST rules. This means that instead
of adjusting their clocks +xxx time in the summer/winter, they adjust by -xxxx at the opposite
season. In this particular case, LDstSave would be a negative number and thus the invalid/ambiguous
rules change from start -> end to end -> start.
}
if LDstSave > 0 then///<------------ LEIDER HIER AUCH
begin
{ Invalid time between transitions (Normal Daylight) }
if After(AChanges.FStartOfDST) and BeforeSum(AChanges.FStartOfDST, LDstSave) then ///<------------ DANN HIER DER Ausstieg Exit(lttInvalid);
Exit(lttInvalid);
{ Ambiguous time between transitions (Normal Daylight) }
if Before(AChanges.FEndOfDST) and AfterSum(AChanges.FEndOfDST, -LDstSave) then
Exit(lttAmbiguous);
end else
begin
{ Invalid time between transitions (Inverse Daylight) }
if Before(AChanges.FStartOfDST) and AfterSum(AChanges.FStartOfDST, LDstSave) then
Exit(lttInvalid);
{ Ambiguous time between transitions (Inverse Daylight) }
if After(AChanges.FEndOfDST) and BeforeSum(AChanges.FEndOfDST, -LDstSave) then
Exit(lttAmbiguous);
end;
{ Northern Hemisphere OR "Winter Daylight" }
if (CompareDateTime(AChanges.FStartOfDST, AChanges.FEndOfDST) < 0) and
(After(AChanges.FStartOfDST) and Before(AChanges.FEndOfDST)) then
Exit(lttDaylight);
{ Southern Hemisphere OR "Summer Daylight" }
if (CompareDateTime(AChanges.FStartOfDST, AChanges.FEndOfDST) > 0) and
(After(AChanges.FStartOfDST) or Before(AChanges.FEndOfDST)) then
Exit(lttDaylight);
end;
end;
Ihr habt nicht zufällig ne idee wie man das in ordnung bringt?
1971 als basisdatum nutzen?
Ich brauche 1899 aus Kompatibilitätsgründen zu Firebird und TDatetime in anderen programmen...