String in TDatetime per Format umwandeln

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

String in TDatetime per Format umwandeln

Beitrag von charlytango »

Hi

möchte einen String

Code: Alles auswählen

2008-11-09T17:36:59Z
in ein Datum umwandeln.
Dazu gibt es zahlreiche Funktionen in den units sysutils und dateutils, alles ok
Natürlich kann ich den String auch zerlegen und daraus ein Datum formen.

Wollte bloß wissen ob ich irgendwo eine existierende elegante Methode übersehen habe bei der man einfach einen Formatstring mit übergibt?

thx

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: String in TDatetime per Format umwandeln

Beitrag von marcov »


Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: String in TDatetime per Format umwandeln

Beitrag von Timm Thaler »

Dann aber https://www.freepascal.org/docs-html/rtl/sysutils/trystrtodatetime.html. Das gibt ein False bei falscher Formatierung, auf das man reagieren kann, das andere wirft nur eine Exception - nagut, auf die kann man auch reagieren... ;-)

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: String in TDatetime per Format umwandeln

Beitrag von wp_xyz »

Die StrToDateTime-Routinen helfen hier nicht, weil diese nur DateSeparator, Timeseparator und Reihenfolge der Datums-/Zeitbestandteile berücksichtigen, aber keine zusätzlichen Zeichen, so wie sie mit FormatDateTime eingebaut werden können. In der Unit DateUtils gibt es ScanDateTime, das man mit demselben FormatString aufrufen kann, der bei FormatDateTime verwendet wurde. Es ist quasi die Umkehrung von FormatDateTime.

Code: Alles auswählen

uses
  DateUtils;
var
  dt: TDateTime;
begin
  dt := ScanDateTime('yyyy-mm-dd"T"hh:nn:ss"Z', '2008-11-09T17:36:59Z')

Beachte, dass die ISO-Trennzeichen T und Z "gequotet" sein müssen. Allerdings scheint die Routine einen Bug zu haben, weil das abschließende Anführungszeichen für das "Z" einen Fehler verursacht.

[EDIT] Der Buf in ScanDateTime wurde inzwischen in fpc-trunk behoben.
Zuletzt geändert von wp_xyz am Mi 10. Okt 2018, 10:36, insgesamt 1-mal geändert.

Timm Thaler
Beiträge: 1224
Registriert: So 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
CPU-Target: Raspberry Pi 3

Re: String in TDatetime per Format umwandeln

Beitrag von Timm Thaler »

TryStrToDateTime kann doch FormatSettings: https://www.freepascal.org/docs-html/rtl/sysutils/tformatsettings.html

Und da geht ShortDateFormat und ShortTimeFormat. Sollte das nicht reichen?

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: String in TDatetime per Format umwandeln

Beitrag von wp_xyz »

Timm Thaler hat geschrieben:TryStrToDateTime kann doch FormatSettings: https://www.freepascal.org/docs-html/rtl/sysutils/tformatsettings.html

Und da geht ShortDateFormat und ShortTimeFormat. Sollte das nicht reichen?

Hast du das ausprobiert?

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: String in TDatetime per Format umwandeln

Beitrag von charlytango »

Erstmal ein herzliches Danke an alle Poster. Das zeigt mir dass ich trotz langer Beschäftigung mit (früher) Delphi und nun Lazarus nur an der Oberfläche kratze ;)

Hast du das ausprobiert?


Mangels Zeit kann ich es mir erst am WE bzw Wochenbeginn vornehmen.

Antworten