Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi über TJsonTextWriter erzeugten Datetime-Wert korrekt einlesen (https://www.delphipraxis.net/215196-ueber-tjsontextwriter-erzeugten-datetime-wert-korrekt-einlesen.html)

juergen 24. Mai 2024 21:37

über TJsonTextWriter erzeugten Datetime-Wert korrekt einlesen
 
Hallo zusammen,

ich schreibe in eine Json-Datei einen TDatetime-Wert.
Delphi-Quellcode:
VAR
  Writer: TJsonTextWriter;
  StringWriter: TStringWriter;
BEGIN
  StringWriter := TStringWriter.Create( );
  Writer := TJsonTextWriter.Create( StringWriter );

  Writer.Formatting := TJsonFormatting.Indented;

  Writer.WriteEndObject;

  Writer.WritePropertyName( 'TimestampFromLastFile' );
  Writer.WriteValue( g_JsonSettingsParams.DatetimeFromLastReadFile.Now() );
  Writer.WriteEndObject;
...
END;
Damit habe ich in der Json-Datei folgenden Wert:
Code:
"2024-05-24T22:13:20.013+02:00"
Dann lese ich den Wert auch wieder aus.
Delphi-Quellcode:
VAR
  my_jsonObj: TJSONObject;
  lDateTime_tmp: TDatetime;
BEGIN
  IF FileExists( frm_ReadPDFFieldsInTable.gs_PathAndFileNameFromSettingJson ) THEN
  BEGIN
    my_jsonObj := TJSONObject.ParseJSONValue( TFile.ReadAllText( ExtractFilePath( ParamStr( 0 ) ) + 'Settings.json', TEncoding.UTF8 { * } ) ) AS TJSONObject;
...
    IF my_jsonObj.TryGetValue<TDateTime>( 'Settings.TimestampFromLastFile', lDateTime_tmp ) THEN
        g_JsonSettingsParams.DatetimeFromLastReadFile := lDateTime_tmp;
...
  END;
END;
...
Wenn ich folgendes verwende, fehlen 2 h.
Delphi-Quellcode:
Memo1.Lines.Add( DateTimeToStr( uReadAndBuildJson.g_JsonSettingsParams.DatetimeFromLastReadFile, TFormatSettings.Invariant ) );
Ergibt den Wert:
Code:
05/24/2024 20:13:20
Wie bekomme ich diesen Wert korrekt ausgelesen?

Vielen Dank schon mal vorab.

juergen 24. Mai 2024 22:58

AW: über TJsonTextWriter erzeugten Datetime-Wert korrekt einlesen
 
Eine Möglichkeit wäre:
Delphi-Quellcode:
// IF my_jsonObj.TryGetValue<TDatetime>( 'Settings.TimestampFromLastFile', lDateTime_tmp ) THEN
         IF my_jsonObj.TryGetValue<String>( 'Settings.TimestampFromLastFile', lString_tmp ) THEN
           BEGIN
             g_JsonSettingsParams.DatetimeFromLastReadFile := ISO8601ToDate(lString_tmp , false );
Allerdings fehlen mir jetzt noch die Millisekunden.

Uwe Raabe 24. Mai 2024 23:59

AW: über TJsonTextWriter erzeugten Datetime-Wert korrekt einlesen
 
Zitat:

Zitat von juergen (Beitrag 1537123)
Allerdings fehlen mir jetzt noch die Millisekunden.

Woran siehst du das? Zumindest unter D12.1 funktioniert das:
Delphi-Quellcode:
  var S := '2024-05-24T22:13:20.013+02:00';
  var dt: TDateTime := ISO8601ToDate(S, False);
  S := FormatDateTime('dd/mm/yyyy hh:mm:ss.zzz', dt); // = '24.05.2024 22:13:20.013'

juergen 25. Mai 2024 07:30

AW: über TJsonTextWriter erzeugten Datetime-Wert korrekt einlesen
 
Guten Morgen Uwe,

Zitat:

Zitat von Uwe Raabe (Beitrag 1537124)
Woran siehst du das?

Ich hatte folgendes für die Darstellung angewendet:

Delphi-Quellcode:
Memo1.Lines.Add( DatetimeToStr( uReadAndBuildJson.g_JsonSettingsParams.DatetimeFromLastReadFile, TFormatSettings.Invariant ) );
Mit deinem Vorschlag funktioniert es. Mir war nicht bewußt, dass DatetimeToStr() das so verkürzt ausgibt.

Delphi-Quellcode:
Memo1.Lines.Add( FormatDatetime('YYYYY-MM-DD HH:NN:SS.zzz', uReadAndBuildJson.g_JsonSettingsParams.DatetimeFromLastReadFile) );

Danke für den Schubs und ein schönes Wochenende!

himitsu 25. Mai 2024 10:07

AW: über TJsonTextWriter erzeugten Datetime-Wert korrekt einlesen
 
Du solltest mal beim FormatSetting reinsehn.
Beim kurzen (HH:MM) und langen Zeitformat (HH:MM:SS) gibt es standardmäßig keine ZZZ :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:43 Uhr.

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