Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: TJSONMarshal / TJSONUnMarshal böse Falle

  Alt 2. Okt 2017, 10:36
Ich verstehe das Problem noch nicht. Ein TDateTime ist lokale Zeit, nicht UTC. Von TObject nach JSON nehmen wir kein UTC an, von Json nach TObject schon. Ich denke, das ist doch so richtig, oder?

Delphi-Quellcode:
program UTCMarshalTest;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  System.DateUtils,
  System.Types,
  System.Json,
  REST.JsonReflect,
  Unit1 in 'Unit1.pas';

procedure p();
var
   marshal: TJsonMarshal;
   unmarshal: TJSONUnMarshal;
   myObject: TMyObject;
   timestamp: TDateTime;
   myObject2: TMyObject;
begin
   marshal := nil; unmarshal := nil;
   myObject := nil; myObject2 := nil;
   try
      marshal := TJSONMarshal.Create();
      unmarshal := TJSONUnMarshal.Create();

      myObject := TMyObject.Create();
      timestamp := EncodeDateTime(2017, 10, 02, 10, 28, 44, 123);
      myObject.FTimeStamp := timestamp;

      myObject2 := unmarshal.CreateObject(
         TMyObject,
         marshal.Marshal(myObject) as TJsonObject
      ) as TMyObject;

      Assert(
         CompareDateTime(myObject.FTimeStamp, myObject2.FTimeStamp)
         =
         System.Types.EqualsValue
      );
   finally
      marshal.Free(); unmarshal.Free();
      myObject.Free(); myObject2.Free();
   end;
end;

begin
   try
      p();
   except
      on E: Exception do
         Writeln(E.ClassName, ': ', E.Message);
   end;
   WriteLn(sLineBreak, 'end.');
   ReadLn;
end.

Geändert von Der schöne Günther ( 2. Okt 2017 um 10:39 Uhr)
  Mit Zitat antworten Zitat