Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi TJSON.JSONToObject DateTime als LocalTime (https://www.delphipraxis.net/213976-tjson-jsontoobject-datetime-als-localtime.html)

Hobbycoder 1. Nov 2023 09:16

TJSON.JSONToObject DateTime als LocalTime
 
Hi,

ich übertrage Datenstrukturen mittels ObjectToJSON und JSONToObject pber http zwischen Client und Server, was soweit recht simple und fehlerfrei funktioniert. Nur bei den TDateTime-Werten habe ich so meine Probleme.

Je nach TJSONOptions habe ich auf der Serverseite eine Abweichung um +1 oder +2 Stunden. Das wird sicherlich auf Grund der zeitzone und Winter-/Sommerzeit so sein.
Jedoch, wie kann ich das verhindern oder wie kann ich das auf die lokale Uhrzeit korrigieren. Die übertragene Zeit soll auf dem Server immer passend zu dessen Computerzeit und Zeitzone angezeigt werden.

Die o.g. Abweichung habe ich schon wenn Server und Client beide auf meinem Rechner laufen. Später soll der Client auch in der Türkei laufen, jedoch bei den übertragenen Daten am Server mit deutscher Zeit angezeigt werden.

Danke im Voraus.

skybibo 1. Nov 2023 09:27

AW: TJSON.JSONToObject DateTime als LocalTime
 
Hi,

normalerweise wird in dem Fall mit UTC gearbeitet. UTC ist unabhängig von der Zeitzone und es gibt keine Sommer/Winterzeit. Die Speicherung und Übertragung erfolgt dann nur im UTC Format und wird dann am Ziel wieder in die Lokale Zeit umgewandelt (oder eine andere Zeitzone).

Hobbycoder 1. Nov 2023 09:38

AW: TJSON.JSONToObject DateTime als LocalTime
 
Über die TJSONOption [joDateIsUTC] kann ich das ja einstellen.

Dann muss ich auf Serverseite mit der Funktion:
Delphi-Quellcode:
function UTCToLocalTime(AValue: TDateTime): TDateTime;
var
  SysTime1, SysTime2: TSystemTime;
  TZinfo: TTimeZoneInformation;
begin
  GetTimeZoneInformation(TZinfo);
  DateTimeToSystemTime(AValue, SysTime1);
  SystemTimeToTzSpecificLocalTime(@TZinfo, SysTime1, SysTime2);
  Result := SystemTimeToDateTime(SysTime2);
end;
das in die lokale Zeit umrechnen. Trotzdem habe ich immer noch eine Stunde zuviel. Berücksichtigt die Funktion SystemTimeToTzSpecificLocalTime keine Sommer-/Winterzeit?

Olli73 1. Nov 2023 09:51

AW: TJSON.JSONToObject DateTime als LocalTime
 
Wie sieht denn der String aus, den du sendest?

2009-06-30T18:30:00+02:00 (lokale Zeit)

oder

2007-12-24T18:21:00Z (UTC)

Hobbycoder 1. Nov 2023 09:54

AW: TJSON.JSONToObject DateTime als LocalTime
 
Gesendet und empfangen wird "2023-11-01T10:52:32.271Z"

Nach der Umrechnung habe ich 01.11.23 11:52:32

Olli73 1. Nov 2023 09:57

AW: TJSON.JSONToObject DateTime als LocalTime
 
sieht aber richtig aus !?

Hobbycoder 1. Nov 2023 10:00

AW: TJSON.JSONToObject DateTime als LocalTime
 
Ja, nur dass wir zu dem Zeitpunkt 10:52 hatten.
Deswegen meine Frage, fehlt das noch die Berücksichtigung Sommer/Winterzeit? Oder muss die Funktion das so können?

Uwe Raabe 1. Nov 2023 10:02

AW: TJSON.JSONToObject DateTime als LocalTime
 
Um 10:52 LocalTime sollte bei UTC aber ein anderer Wert herauskommen als "2023-11-01T10:52:32.271Z". Das Problem liegt also vermutlich beim Sender und nicht beim Empfänger.

Wie sieht denn der Code auf Client-Seite aus?

Olli73 1. Nov 2023 10:04

AW: TJSON.JSONToObject DateTime als LocalTime
 
Was passiert wenn du "joDateIsUTC" abschaltest?

Hobbycoder 1. Nov 2023 10:12

AW: TJSON.JSONToObject DateTime als LocalTime
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1528825)
Um 10:52 LocalTime sollte bei UTC aber ein anderer Wert herauskommen als "2023-11-01T10:52:32.271Z". Das Problem liegt also vermutlich beim Sender und nicht beim Empfänger.

Wie sieht denn der Code auf Client-Seite aus?

Delphi-Quellcode:
UE:=TJson.JsonToObject<TUserEntry>(Str, [joIgnoreEmptyStrings, joIgnoreEmptyArrays, joDateIsUTC]);
bzw.
Delphi-Quellcode:
Result:=TJson.ObjectToJsonString(Self, [joIgnoreEmptyStrings, joIgnoreEmptyArrays, joDateIsUTC]);
Beides jeweils in einer Funktion des Objects.

Server und Client verwenden die gleiche Unit und laufen auch beim Test auf dem gleichen Rechner.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz