Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Datumsformat (TT.MM.JJJJ) anzeigen (https://www.delphipraxis.net/196645-datumsformat-tt-mm-jjjj-anzeigen.html)

TUX_der_Pinguin 6. Jun 2018 09:39

Datumsformat (TT.MM.JJJJ) anzeigen
 
Guten Morgen,

ich möchte neben einem Eingabefeld das aktuelle Datumsformat anzeigen lassen, so wie das auch in den Regionaleinstellungen von Windows angezeigt wird. Leider bekomme ich bisher nur an ein internes Format welches auch auf einem deutschen Windows in englischer Schreibweise dargestellt wird.

Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(FmtSet.ShortDateFormat);
Die Ausgabe lautet 'dd/MM/yyyy' in den Windows Einstellungen steht jedoch 'TT.MM.JJJJ', jetzt die Frage wie schaffe ich es das mir das Format genau so angezeigt wird. Bzw. es müsste immer so dargestellt werden wie das jeweilige System eingestellt ist, also je nach Spracheinstellung.

TRomano 6. Jun 2018 10:15

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Hallo,

ergibt aber das richtige Ergebnis:

Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(DateToStr(Now,FmtSet);
Gruß Thomas

TUX_der_Pinguin 6. Jun 2018 10:30

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Zitat:

Zitat von TRomano (Beitrag 1404019)
Hallo,

ergibt aber das richtige Ergebnis:

Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(DateToStr(Now,FmtSet);
Gruß Thomas

Ich will kein Datum formatieren sondern die Formatierung anzeigen.


So sollte es sein...
Zitat:

Bitte geben sie das Datum im Format TT.MM.JJJJ ein!
und so ist es im Moment
Zitat:

Bitte geben sie das Datum im Format dd/MM/yyyy ein!

Der schöne Günther 6. Jun 2018 11:22

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Knifflige Frage.

Die paar Leute die sich im Internet die gleiche Frage gestellt haben ([1], [2]) hast du sicher auch schon gefunden. Da das Format mit 'yyyy' oder 'dd' dokumentiert und sprachunabhängig ist [3] musst du die halt durch deine eigene lokalisierte Fassung ersetzen. Beispielsweise so in der Art:
Delphi-Quellcode:
uses
   System.SysUtils,
   WinApi.Windows,
   Vcl.Dialogs;

function getShortDateFormat(): String;
const
   lcType = LOCALE_SSHORTDATE;
var
   str: String;
   bufferSize: Integer;
begin
   bufferSize := GetLocaleInfoEx(
      PChar(LOCALE_NAME_USER_DEFAULT),
      lcType,
      nil,
      0
   );
   str := String.Create(#0, bufferSize);
   Win32Check(
      GetLocaleInfoEx(
         PChar(LOCALE_NAME_USER_DEFAULT),
         lcType,
         PChar(str),
         bufferSize
      ) = bufferSize
   );
   Result := Str;
end;

procedure p();
resourcestring
   shortDay = 'T';
   shortMonth = 'M';
   shortYear = 'Y';
var
   shortDateFormat: String;
begin
   shortDateFormat :=
      getShortDateFormat()
      .Replace('d', shortDay)
      .Replace('M', shortMonth)
      .Replace('y', shortYear);
   ShowMessage(shortDateFormat);
end;

[1] http://forums.codeguru.com/showthrea...indowsversions
[2] https://stackoverflow.com/q/12591993/2298252
[3] https://technet.microsoft.com/de-de/.../dd317787.aspx

HolgerX 6. Jun 2018 14:11

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Hmm..

Zitat:

Zitat von TUX_der_Pinguin (Beitrag 1404012)
Die Ausgabe lautet 'dd/MM/yyyy' in den Windows Einstellungen steht jedoch 'TT.MM.JJJJ', jetzt die Frage wie schaffe ich es das mir das Format genau so angezeigt wird. Bzw. es müsste immer so dargestellt werden wie das jeweilige System eingestellt ist, also je nach Spracheinstellung.


Da bist Du in eine kleine Windows-Falle gatappt!

Ich vermute, dass dein Rechner entweder ein auf deutsch umgestelltes englisches Windows ist, oder dass hier der Windows 7 EN auf 10 Upgrade-Bug zugeschlagen hat! ;)

Nehme mal statt LOCALE_SYSTEM_DEFAULT das LOCALE_USER_DEFAULT


Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_USER_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(FmtSet.ShortDateFormat);
Denn mit LOCALE_SYSTEM_DEFAULT werden die OS-Einstellungen gelesen, mit LOCALE_USER_DEFAULT die User-Einstellungen, welche dir auch von Windows angezeigt werden...

Alallart 6. Jun 2018 14:12

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
@TUX_der_Pinguin

Hier eine kleine Funktion aus einem meiner Programme:
Delphi-Quellcode:
const
  FS_Ger_DateSeparator = '.';
  FS_Ger_TimeSeparator = ':';

function FS: TFormatSettings;
begin
  GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, Result);
  Result.DateSeparator := FS_Ger_DateSeparator;
  Result.TimeSeparator := FS_Ger_TimeSeparator;
  Result.ShortDateFormat := 'dd/MM/yyyy';
  Result.ShortTimeFormat := 'hh:mm';
  Result.LongTimeFormat   := 'hh:mm:ss';
end;
Das habe ich so geregelt, weil ich das Datum und Uhrzeit unabhängig einer Landeseinstellung immer im gleichen Format speichern und lesen wollte.

Zuerst zu den Schrägstrichen "/" in TFormatSettings. Die muss man als Platzhalter verstehen. Zufällig passt es zu der us-amerikanischen Schreibweise. Wenn du da etwas anders rein schreibst, zB. Rauten:
Delphi-Quellcode:
Result.ShortDateFormat := 'dd#MM#yyyy'
deaktivierst du sozusagen die Platzhalterfunktion. In dem Fall wird das Datum mit Rauten angezeigt. Ist es ein Schrägstrich, wird das Zeichen aus
Delphi-Quellcode:
Result.DateSeparator
genommen. Diese Besonderheit darf man nicht vergessen . Also entweder man läßt die Schrägstriche in Ruhe, dann nimmt das System den DateSeparator, oder du manipulierst den String in ShortDateFormat direkt (was ich nicht empfehlen würde).

Machen wir ein Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  FS2: TFormatSettings;
begin
  FS2 := FS;
  ShowMessage(FormatDateTime(FS2.ShortDateFormat, Now, FS2));
end;
Änder nun diese Zeile:
Delphi-Quellcode:
const
  FS_Ger_DateSeparator = '~';
Soviel zum Thema Punkt und Strich. Der Strich ist nur ein Platzhalter für das eigentliche Zeichen. Wo es die Umrechnung von TT zu dd oder YYYY zu JJJJ gibt weiß ich nicht. Vermutlich gibt es auch einen Record mit den Informationen.

Uwe Raabe 6. Jun 2018 14:36

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Einige hier scheinen die Problemstellung einfach nicht richtig zu verstehen. Vielleicht solltest du einen konkreten Test-Case machen, der genau zeigt, was du haben willst.

So wie ich das sehe, handelt es sich hier eher um ein Übersetzungsproblem und nicht um die länderspezifische Darstellung eines Datums.

en-US: 'mm/dd/yyyy'
de-de: 'TT.MM.JJJJ'

Gefragt ist also nicht der tatsächliche Format-String, der z.B. für FormatDate verwendet wird, sondern der Hinweistext zur Eingabe eines Datumswerts.

TUX_der_Pinguin 8. Jun 2018 08:22

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe (Beitrag 1404061)
Einige hier scheinen die Problemstellung einfach nicht richtig zu verstehen. Vielleicht solltest du einen konkreten Test-Case machen, der genau zeigt, was du haben willst.

So wie ich das sehe, handelt es sich hier eher um ein Übersetzungsproblem und nicht um die länderspezifische Darstellung eines Datums.

en-US: 'mm/dd/yyyy'
de-de: 'TT.MM.JJJJ'

Gefragt ist also nicht der tatsächliche Format-String, der z.B. für FormatDate verwendet wird, sondern der Hinweistext zur Eingabe eines Datumswerts.

Der Uwe hat's verstanden, es geht allein um den Hinweis Text. Wie er in den Windows Einstellungen auch zu sehen ist.

Anhang 49217

Zitat:

Zitat von HolgerX (Beitrag 1404056)
Da bist Du in eine kleine Windows-Falle gatappt!

Ich vermute, dass dein Rechner entweder ein auf deutsch umgestelltes englisches Windows ist, oder dass hier der Windows 7 EN auf 10 Upgrade-Bug zugeschlagen hat! ;)

Nehme mal statt LOCALE_SYSTEM_DEFAULT das LOCALE_USER_DEFAULT


Delphi-Quellcode:
var
  FmtSet: TFormatSettings;

begin
  {$WARN SYMBOL_PLATFORM OFF}
  FmtSet := TFormatSettings.Create(LOCALE_USER_DEFAULT);
  {$WARN SYMBOL_PLATFORM ON}

  ShowMessage(FmtSet.ShortDateFormat);
Denn mit LOCALE_SYSTEM_DEFAULT werden die OS-Einstellungen gelesen, mit LOCALE_USER_DEFAULT die User-Einstellungen, welche dir auch von Windows angezeigt werden...

Und ob ich jetzt 'LOCALE_SYSTEM_DEFAULT' oder 'LOCALE_USER_DEFAULT' verwende spielt keine Rolle ich bekomme immer nur das interne Format (z.B. dd/MM/yyyy) zurück. Bei dem Windows handelt es sich um Windows 7 Ultimate, welches auf deutsch eingestellt ist.

haentschman 8. Jun 2018 08:38

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Moin...8-)

Imho haben die FormatSettings einen Bug was die Zeit betrifft.
https://www.delphipraxis.net/188843-...s-dummies.html

Zitat:

Bei dem Windows handelt es sich um Windows 7 Ultimate
Früher gab es mal Windows 7 Versionen die falsch installiert waren. Obwohl Deutsch eingestellt war, wurden die englischen Einstellungen geladen. Da half das Umstellen auf Englisch und wieder zurück.

TUX_der_Pinguin 8. Jun 2018 08:50

AW: Datumsformat (TT.MM.JJJJ) anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von haentschman (Beitrag 1404231)
Moin...8-)

Imho haben die FormatSettings einen Bug was die Zeit betrifft.
https://www.delphipraxis.net/188843-...s-dummies.html

Zitat:

Bei dem Windows handelt es sich um Windows 7 Ultimate
Früher gab es mal Windows 7 Versionen die falsch installiert waren. Obwohl Deutsch eingestellt war, wurden die englischen Einstellungen geladen. Da half das Umstellen auf Englisch und wieder zurück.

Wie gesagt es geht nicht um die Format Einstellungen, die sind meiner Meinung nämlich soweit in Ordnung, es geht um den lokalisierten Hinweis Text und wie man daran kommt. Irgendwie macht Windows das ja auch. Der Anwender soll einen Hinweis erhalten wie er ein Datum bzw. eine Uhrzeit eingeben soll und dieser Hinweis soll analog zu den Windows Regional Einstellungen sein. Sprich bei einem deutschen Windows mit deutschen Regional Einstellungen soll da stehen 'TT.MM.JJJJ' ein 'TFormatSettings.ShortDateFormat' gibt aber 'dd/MM/yyyy' aus. Das Format ist korrekt nur die Darstellung nicht so wie ich das gerne hätte.

Anhang 49218


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:01 Uhr.
Seite 1 von 4  1 23     Letzte »    

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