Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen??? (https://www.delphipraxis.net/157995-formatierung-der-datum-und-zeit-je-nach-windows-spracheinstellungen.html)

romber 1. Feb 2011 19:22

Delphi-Version: 5

Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Hallo!

Server sendet dem Client XML-Daten mit mehreren Datum-Zeit-Feldern (z.B. 01.02.2011 18:20:51) drin, die dann auf der Client-Seite mittels StrToDateTime() den TDateTime-Eigenschaften eines Objekts zugewiesen werden. Wenn in den Windows-Einstellungen für Region und Sprache eine andere Sprache eingestellt ist (z.B. Englisch oder Arabisch) schlägt die Umwandlung mit StrToDateTime() fehl, weil die Datum- und Zeitformat anders sind. Das Problem lässt sich natürlich ganz einfach lösen, indem man beim Start des Programms die SysUtils-Variablen DateSeparator, ShortDateFormat und LongTimeFormat vorsorglich mit deutschen Werten überschreibt. Das Problem ist, dass wenn ich dann die Datum und Zeit aus der Eigenschaft in der aktuell eingestellten Sprache visualisieren möchte, muss ich die o.g. Variablen wieder in den ursprünglichen Zustand zurücksetzen.

Wie mache ich das?

Gibt es in meinem Fall eine Möglichkeit, die im deutschen Format übertragene Datum und Zeit einer TDateTime-Variable zuzuweisen, ohne die o.g. SysUtils-Variablen zu überscheiben?

Danke!

mkinzler 1. Feb 2011 19:26

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Verwende die überladene Funktion mit den Formateinstellungen

himitsu 1. Feb 2011 19:35

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Er meint das Delphi-Referenz durchsuchenTFormatSettings (z.B. siehe hier Delphi-Referenz durchsuchenFormatDateTime)

Dafür initialisierst du dir in deiner Anwendung eine globale Version davon, welche beim Programmstart mit den gewünschten Werten belegt und dann überall mit angegeben wird.
Oder du kapselst dir alles in einer Funktion, welche dir einen "Serverzeitstring" zurückliefert.


[edit]
aber mir fällt grad ein (falls die Delphiangabe im Thread absicht ist und nicht einfach nur vergessen wurde und da nichts im Profil steht)...
Gab es diese Parameter in Delphi 5 schon?

peschai 1. Feb 2011 20:16

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Hallo

Vorschlag:

Delphi-Quellcode:
// Beispiel:
// s3  := '2008-09-23T14:15:22.984';
// dt6 := fctString2DateTime('YYYY MM DD HH NN SS ZZZ',s3);

function fctString2DateTime(const sFormat,sDateTimeString:String):TDateTime;
var
  i0 : integer;
  w1Year,w2Month,w3Day,w4Hour,w5Min,w6Sec,w7MSec:Word;
  i8 : Integer;
begin
  // local init
  Result := 0.0;
  i0     := 0;
  w1Year := 0;
  w2Month:= 0;
  w3Day := 0;
  w4Hour := 0;
  w5Min := 0;
  w6Sec := 0;
  w7MSec := 0;
  i8     := 0;
  // local main
  try
    if (Length(sFormat)=Length(sDateTimeString)) then
      begin
        for i8 := 1 to Length(sFormat) do
          begin
            i0 := Ord(sDateTimeString[i8])-48;
            if (i0>=0) and (i0<=9) then
              begin
                case sFormat[i8] of
                  'Y','y':w1Year := w1Year * 10 + i0;
                  'M','m':w2Month := w2Month * 10 + i0;
                  'D','d':w3Day  := w3Day  * 10 + i0;
                  'H','h':w4Hour := w4Hour * 10 + i0;
                  'N','n':w5Min  := w5Min  * 10 + i0;
                  'S','s':w6Sec  := w6Sec  * 10 + i0;
                  'Z','z':w7MSec := w7MSec * 10 + i0;
                end;
              end;
          end;
      end;
    Result := EncodeDateTime(w1Year,w2Month,w3Day,w4Hour,w5Min,w6Sec,w7MSec);
  except
    Result := 0.0;
  end;
end;

romber 1. Feb 2011 20:58

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Vielen Dank für die schnelle Reaktionen!

Zitat:

Zitat von himitsu (Beitrag 1078937)
Dafür initialisierst du dir in deiner Anwendung eine globale Version davon, welche beim Programmstart mit den gewünschten Werten belegt und dann überall mit angegeben wird.

Das klappt sehr gut. Danke! Ich rufe GetLocaleFormatSettings und fülle die meine FormatSettings mit aktuellen Werten.
Aber um empfangene Datum und Zeit in TDateTime umzuwandelt, muss ich die DateSeparator, ShortDateFormat und LongTimeFormat vor der Umwandlung trotzdem überschreiben, oder gibt es dafür auch eine Funktion?

@peschai

Vielen Dank! Ich schaue mir die Funktion jetzt an.

mkinzler 1. Feb 2011 21:02

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Standardmässig sollten die Systemeinstellungen automaticsh verwendet werden.

Stevie 2. Feb 2011 11:49

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Vergiss die Zeitzonen Informationen nicht, wenn sich Client und Server in unterschiedlichen Zeitzonen aufhalten gibts sonst verfälschte Daten.

hoika 2. Feb 2011 12:02

AW: Formatierung der Datum und Zeit je nach Windows-Spracheinstellungen???
 
Hallo,

schreib dir doch eine eigene StrToDateTime2,
in der du die Originalvariablen (DateSeparator, ShortDateFormat und LongTimeFormat) rettest,
deine eigenen Werte setzt und im finally die geretteten Daten wieder zurückschreibst.


Heiko


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