Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
630 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: TPlannerDatePicker / Null Datum nicht zu fassen

  Alt 20. Aug 2020, 13:37
Ganz lieben Dank vor allem an Philipp, doch auch an alle anderen.
Das sind wirklich ganz neue Einsichten.

Ich habe jetzt die Pervers-Lösung mit DateToStr / StrToDate implementiert.
Meine ersten Versuche waren "Nicht-Null".
Die nächsten Tage und Einträge werden zeigen, ob das so bleibt.
Ein grosser Fehler bei vielen Leuten ist nähmlich, dass man meint, die Windows Format Settings entspreche den Delphi Formatregel. Das ist NICHT so und so dürfen die Systemsettingsformate eben nicht in Funktionen wie FormatDateTime verwendet werden! Diese Funktion hat andere Formatregeln (siehe Delphi Hilfe). Insbesondere das "m" Zeichen gilt in Delphi für den Monat und das "n" muss für die Minuten verwendet werden. Windows behandelt das kommlett anderst. Ausserdem sollte man da beim Format immer die ANSI Notation nutzen, da es sonst zu fehlerhaften Datumskonvertierungen kommt, wenn das System andere Einstellungen hat.

Delphi-Quellcode:
// Falsch:
FormatDateTime('dd.mm.yyyy hh:nn:ss', Now))

// Richtig (nur so wird das Systemtdatumsrennzeichen verwendet):
FormatDateTime('dd/mm/yyyy hh:nn:ss', Now))

// Will man immer das Systemdatum nutzen reicht ein s:=DateTimeToStr(Now) und d:=StrToDateTime(s), das dann das Datum im Windows Format ausgibt oder zurückverwandelt. FormatDateTime ist eigentlich nur dazu da, wenn man vom Systemstandard abweichen will.
Der falsche Code führt bei folgendem Code in einer Englischen Windows Region zu einem Datumskonvertierungsfehler:
Delphi-Quellcode:
// Das Datum wird hier mit einem "fixen" Punkt als Trennzeichen geformt, also nicht mit dem Systemtrennzeichen. Es ergibt also immer ein Datum mit Punkt, was mit der USA Windows Region falsch wäre.
s := FormatDateTime('dd.mm.yyyy hh:nn:ss', Now))

// Wenn auf dem System nicht der Punkt das Datumstrennzeichen ist, sondern z.B. "/", führt dieser Aufruf zu einem Konvertierungsfehler!
d := StrToDateTime(s);
Eventuel ist genau das dein Prolbem, dass du da irgenwo FormatDatTime nutzt, das ein falsches Format angeben hat (Punkt anstatt "/").

Geändert von Rolf Frei (20. Aug 2020 um 17:49 Uhr)
  Mit Zitat antworten Zitat