Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi String in Datum umwandeln (https://www.delphipraxis.net/203233-string-datum-umwandeln.html)

ngott2 27. Jan 2020 11:20

String in Datum umwandeln
 
Hallo zusammen,
ich bekomme von einer API diesen schönen String zurück. 2017-12-07T09:23:19.542+0000
Diesen würde ich gerne in ein TDateTime verwandeln. StrToDateTime Funktioniert leider nicht. Wird es funktionieren, wenn ich eine TFormatSettings mit übergebe?
Wenn ja gibt es irgend eine Webseite die mir gleich den richtigen String für TFormatSettings ausgeben kann. Weil ich kennne mich mit TFormatSettings überhaupt nicht aus.

Gruß,
ngott2

mkinzler 27. Jan 2020 11:34

AW: String in Datum umwandeln
 
Handelt sich um ein Datum im ISO-Format.

Delphi-Quellcode:
ISO8601ToDate()

Rolf Frei 27. Jan 2020 11:34

AW: String in Datum umwandeln
 
Delphi-Quellcode:
uses
  XSBuiltIns;

DelphiDateTime := XMLTimeToDateTime('2017-10-19T15:10:33.424Z'); // GMT

DelphiDateTime := XMLTimeToDateTime('2017-12-07T09:23:19.542+0000'); // eigene Timezone
ISO8601ToDate() kommt mit deinem String leider nicht zurecht. Da passt ihm der Timezone Offset in disem Format nicht.

Neutral General 27. Jan 2020 11:35

AW: String in Datum umwandeln
 
System.DateUtils: ISO8601ToDate

Uwe Raabe 27. Jan 2020 12:04

AW: String in Datum umwandeln
 
Zitat:

Zitat von Rolf Frei (Beitrag 1456066)
ISO8601ToDate() kommt mit deinem String leider nicht zurecht. Da passt ihm der Timezone Offset in disem Format nicht.

In 10.3.3 schon: DecodeISO8601Time fails if no colon in the time zone offset

ngott2 27. Jan 2020 12:08

AW: String in Datum umwandeln
 
Hey danke für die Antworten.
Leider funktionieren beide Funktionen mit meinem String nicht. Sind noch bei Delphi Seattle.

Der String den ich jetzt zum Testen genommen habe: '2020-01-24T10:56:47.850+0100'

Bei der ISO601ToDate Funktion bekomme ich:
---------------------------
Anwendungsfehler
---------------------------
Ungültiger Zeit-Offset-String: 10:56:47.850+0100.

Bei XMLTimeToDateTime bekomme ich

---------------------------
Anwendungsfehler
---------------------------
Exception EConvertError in Modul *******.exe bei 0002C9CA.

Ungültiges Argument zum Codieren der Uhrzeit.


Hat jemand noch eine Idee bzw. Lohnt es sich es zu versuchen mit TDateFormat?

Rolf Frei 27. Jan 2020 12:38

AW: String in Datum umwandeln
 
XMLTimeToDateTime gibt es seit D7 und funktioniert da leider mit dem Offset "+0000" auch nicht. Das Z Format, also GMT, geht hingegen fehlerfrei. In 10.2.3 geht das aber auch mit dem +xxxx Format ohne Fehler.

Uwe Raabe 27. Jan 2020 12:39

AW: String in Datum umwandeln
 
Zitat:

Zitat von ngott2 (Beitrag 1456073)
Lohnt es sich es zu versuchen mit TDateFormat?

Eher nicht.

Ich würde einen Wrapper um ISOISO601ToDate machen, der bei Bedarf den Doppelpunkt im Zeit-Offset ergänzt:
Delphi-Quellcode:
function ISO8601ToDate(const AISODate: string; AReturnUTC: Boolean = True): TDateTime;
var
  idxSign: Integer;
  S: string;
begin
  S := AISODate;
  idxSign := S.LastIndexOfAny(['+', '-']);
  if S.LastIndexOf(':') < idxSign then
    S := S.Insert(idxSign + 3, ':');
  Result := System.DateUtils.ISO8601ToDate(S, AReturnUTC);
end;
Bei einem Update auf 10.3.3+ kannst du den ja wieder rausnehmen.

Der schöne Günther 27. Jan 2020 12:42

AW: String in Datum umwandeln
 
Grade mit 10.0 Seattle ausprobiert,
Delphi-Quellcode:
Soap.XsBuiltIns.XMLTimeToDateTime(..)
geht problemlos.

ngott2 27. Jan 2020 12:56

AW: String in Datum umwandeln
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1456077)
Zitat:

Zitat von ngott2 (Beitrag 1456073)
Lohnt es sich es zu versuchen mit TDateFormat?

Eher nicht.

Ich würde einen Wrapper um ISOISO601ToDate machen, der bei Bedarf den Doppelpunkt im Zeit-Offset ergänzt:
Delphi-Quellcode:
function ISO8601ToDate(const AISODate: string; AReturnUTC: Boolean = True): TDateTime;
var
  idxSign: Integer;
  S: string;
begin
  S := AISODate;
  idxSign := S.LastIndexOfAny(['+', '-']);
  if S.LastIndexOf(':') < idxSign then
    S := S.Insert(idxSign + 3, ':');
  Result := System.DateUtils.ISO8601ToDate(S, AReturnUTC);
end;
Bei einem Update auf 10.3.3+ kannst du den ja wieder rausnehmen.

Danke damit funktioniert es bei mir. Das ist für mich als Lösung ausreichend.

Danke euch allen. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:52 Uhr.

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