Ich frage mich seit geraumen warum eine App plötzlich Timestamps falsch berechnet.
Der Grund war das Encoding / Decoding mit TJSONMarshal / TJSONUnMarshal.
Das hat bis dato gut funktioniert, Object zu String, und zurück, aber seit womöglich 10.1 Berlin gab es da plötzlich Probleme.
Normalerweise debugge ich nicht tief in die System Sourcen, aber hier musste es mal wieder sein
Der Grund war das TJSONMarshal / TJSONUnMarshal anscheinend neuerdings unterschiedliche IsDateTimeUTC settings per Default eingestellt haben.
Kann jetzt nicht genau sagen seit wann ...
Die Lösung war das explizit mit anzugeben, um die Konvertierungen kompatibel zu machen, also
LMar.DateTimeIsUTC := True;
für Marshal/Unmarshal:
Delphi-Quellcode:
function TParcel.InternalMarshal_ToString : String;
var
LMar : TJSONMarshal;
begin
LMar := TJSONMarshal.Create(); // This doesn't correctly set DateTimeUTC by default
try
LMar.DateTimeIsUTC := True; // !!! Important to ensure same Coding/Decoding
Result := LMar.Marshal(Self).ToString; // as TJSonObject;
finally
LMar.Free;
end;
end;
function TParcel.InternalUnmarshal_FromObject(value: TJSONObject): TParcel;
var
LMar: TJSONUnMarshal;
begin
Result := nil;
if not Assigned( value ) then
Exit;
LMar := TJSONUnMarshal.Create(); // This sets DateTimeIsUTC internally by default
try
LMar.DateTimeIsUTC := True; // !!! Important to ensure same Coding/Decoding
...
...
...
finally
LMar.Free;
end;
end;
Wenn es nicht gleich gesetzt wird kann es zu einer Zeitdifferenz dei Encode/Decode kommen von 2:00h.
Das ist definitiv nicht das was ich erwarten würde
Rollo