Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Merkwürdigkeiten mit FormatSettings.ShortDateFormat (https://www.delphipraxis.net/214758-merkwuerdigkeiten-mit-formatsettings-shortdateformat.html)

boettcher 5. Mär 2024 11:29

Delphi-Version: 12 Athens

Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Ich bin auf Merkwürdigkeiten bei der Verwendung von FormatSettings.ShortDateFormat gestoßen.

Ich habe ein Programm von RAD Studio 2007 auf RAD Studio Athens umgestellt (zwar C++, aber das sollte keinen Unterschied zu Delphi machen).

In diesem alten Thema ...

https://www.delphipraxis.net/169768-...ateformat.html

... habe ich folgende Aussage zu FormatSettings.ShortDateFormat gefunden:

Zitat:

Bei Delphi 7 und 2009 -> 'dd.mm.yyyy'
Bei Delphi XE2 -> 'dd/mm/yyyy'
Mit RAD Studio 2007 hatte ich auch immer den Wert "dd.mm.yyyy". Aussage passt hier also.
Mit Athens erstellt ist es bei mir und einem Teil der Anwender allerdings 'dd.mm.yyyy' und bei einigen Anwendern 'dd/mm/yyyy'. Also der Wert nicht immer identisch.

:?: Frage 1: Weiß jemand wie dieser Unterschied zustande kommt (Windows-Version/-Einstellungen/...)?

Nun könnte man meinen, dass das in der Praxis keinen Unterschied macht, sofern man dazu noch FormatSettings.DateSeparator berücksichtigt.

Ich verwende eine Datumkonvertierung ähnlicher Art (hier vereinfachter Code):
Code:
UnicodeString ConvertDate( UnicodeString Datum )
{
   TDateTime dt;


   FormatSettings.DateSeparator = '.';
   FormatSettings.ShortDateFormat = "dd/mm/yyyy"; // alternativ "dd.mm.yyyy"

   dt = StrToDateDef( Datum , -1 );
   if ( (int)dt != -1 ) {

      FormatSettings.DateSeparator = '.';
      FormatSettings.ShortDateFormat = "dd.mm.yyyy";

      Datum = DateTimeToStr( dt );

   }

   return( Datum );
}
Ich übergebe der Funktion den Wert "1902". Was wäre als Ergebnis zu erwarten?

Bei Verwendung von ...
Code:
FormatSettings.ShortDateFormat = "dd/mm/yyyy";
... erhalte ich den Rückgabewert "19.02.2024".

Bei Verwendung der Alternative ...
Code:
FormatSettings.ShortDateFormat = "dd.mm.yyyy";
... den Rückgabewert "1902" - also den Eingabewert, weil die StrToDateDef-Funktion -1 zurückliefert.

Ich finde die Ergebnisse überraschend. :o

:?: Frage 2: Bug, Feature oder Denkfehler meinerseits?

Gruß, Dirk

Rollo62 5. Mär 2024 14:51

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
https://docwiki.embarcadero.com/Libr...s.StrToDateDef

Zitat:

Mit StrToDateDef kann ein String in eine Datumsangabe zerlegt werden. Enthält S kein gültiges Datum, gibt StrToDateDef Default zurück.

Der String S muss aus zwei oder drei Zahlen bestehen, die durch das in der globalen Variable DateSeparator bzw. deren TFormatSettings-Entsprechung definierte Zeichen voneinander getrennt sind. Die Reihenfolge von Tag, Monat und Jahr wird von der globalen Variable ShortDateFormat bzw. deren TFormatSettings-Entsprechung bestimmt (mögliche Kombinationen sind M/T/J, T/M/J und J/M/T).

Enthält der String S lediglich zwei Zahlen, wird er als Datum (M/T oder T/M) des aktuellen Jahres interpretiert.

himitsu 5. Mär 2024 15:28

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Im StrToDate, bzw. der internen Funktion darin, wurde in D11 so Eniges umgebaut.
https://www.delphipraxis.net/210022-...r-richtig.html

Das Globale FormatSetting umzuschreiben, ist eh keine gute Idee.
Aus diesem Grund haben viele das Datums-/Zeitfunktionen auch noch einen entsprechenden FormatSettings-Parameter.

himitsu 5. Mär 2024 15:32

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Ach ja, in Vorinstallierten Windowsen einiger Computer-Hersteller ist ein Bug, seit Jahrzehnten.

Im Windows gibt es mehrere Stellen, wo das "aktuelle" Datumsformat gespeichert wurde.
einige neuere API verwenden die neue Stelle,
aber gewisse API (welche Delphi benutzt) verwenden die alte Stelle.

Leider wurde in der Installation das Datum manuell in der Registry nur teilweise gesetzt.
In den Windowseinstelltungen das Datumsformat einmal auf was Anderes einstellen (z.B. englisch) und dann wieder zurück auf Deutsch, womit dann alle wichtigen Stellen richtig gespeichert sind.

boettcher 5. Mär 2024 17:25

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Der Text war mir bekannt ...
Zitat:

Zitat von Rollo62 (Beitrag 1534198)
Zitat:

Enthält der String S lediglich zwei Zahlen, wird er als Datum (M/T oder T/M) des aktuellen Jahres interpretiert.

"1902" würde ich nicht zwingend als "zwei Zahlen" ansehen - und der gesamte Text lässt erwarten, dass ein Datumstrenner dazwischen sein muss.

Nichts desto trotz verwundert es, dass es bei "dd/mm/yyyy" ein anderes Ergebnis gibt als bei "dd.mm.yyyy".

- Dirk

boettcher 5. Mär 2024 17:36

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Zitat:

Zitat von himitsu (Beitrag 1534199)
Aus diesem Grund haben viele das Datums-/Zeitfunktionen auch noch einen entsprechenden FormatSettings-Parameter.

Und was übergibt man dann einer solchen Funktion als ShortDateFormat?
"dd/mm/yyyy" oder "dd.mm.yyyy"?
Wo ich doch auf unterschiedlichen Rechnern unterschiedliche Werte auslese.
Zitat:

Zitat von himitsu (Beitrag 1534201)
In den Windowseinstelltungen das Datumsformat einmal auf was Anderes einstellen (z.B. englisch) und dann wieder zurück auf Deutsch, womit dann alle wichtigen Stellen richtig gespeichert sind.

Das kann man als Entwickler mal so machen, aber nichts, was man seinen Kunden raten kann, falls sie mal Probleme feststellen.

- Dirk

himitsu 5. Mär 2024 20:30

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Sorry, es ist ein Bug im Windows, also gehört er auch dort gelöst.

Uwe Raabe 5. Mär 2024 22:22

AW: Merkwürdigkeiten mit FormatSettings.ShortDateFormat
 
Frag mich nicht ob das so beabsichtigt ist, aber man kann bei
Delphi-Quellcode:
ShortDateFormat := 'dd/mm/yyyy';
den 19.Februar 2024 (und zumindest in diesem Jahr) auch auf folgende Weise eingeben: "1902", "190224" oder "19022024".
Der aktuell eingestellte DateSeparator ist dabei egal, solange es kein Blank ist.

Die ScanDate Funktion checkt zwar auf den DateSeparator, nimmt ihn aber implizit an wenn keiner da ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:39 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