Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Sonstiges (https://www.delphipraxis.net/45-library-sonstiges/)
-   -   Uhrzeit und Datum regionsunabhängig ausgeben (https://www.delphipraxis.net/6624-uhrzeit-und-datum-regionsunabhaengig-ausgeben.html)

daniel-volk 17. Jul 2003 08:07


Uhrzeit und Datum regionsunabhängig ausgeben
 
Jeder, der schon einmal in einem Programm mit Daten und Uhrzeiten gearbeitet hat, kennt das Problem.
Mit den Befehlen
Delphi-Quellcode:
uhrzeit := TimeToStr(Time);
lokaldatum := DateToStr(Date);
lassen sich so einfach das Datum und die Uhrzeit in einen String schreiben. Mit ein wenig Stringverarbeitung kann man damit dann sogar rechnen.
Doch auch das Problem ist nicht weit: In Deutschland sind die PCs (normalerweise) so eingestellt, dass die Zeit im 24h-Format als HH:mm:ss und das Datum als TT.MM.JJJJ werden. Doch was ist in anderen Ländern, wo die Zeit mit AM und PM ausgegeben wird? Oder in Ländern, in denen beim Datum keine Nullen geschrieben werden, sodass der Monat plötzlich nur noch eine Stelle hat?
Noch schlimmer ist es mit der amerikanischen Zeit. Die Amerikaner verwenden nämlich das 12h-Zeitformat und ein Datum der Form: M/T/JJJJ.
Der Monat und der Tag sind also vertauscht und werden zudem noch so kurz wie möglich geschrieben.

Der folgende Algorithmus gibt grundsätzlich die aktuelle Zeit im Format HH:mm:ss und das aktuelle Datum im Format TT.MM.JJJJ aus. Völlig unabhängig von der Region. (Beispiel: 08:55:30 17.07.2003)
Wenn beim Uhrzeitalgorithmus der Ausgeklammerte Code auch mit verwendet wird, dann wird die Zeit mit Millisekunden angegeben, also im Format HH:mm:ss,sss (Sekunden mit drei Nachkommastellen).

Code für die Zeitausgabe:
Zuerst einmal müssen die Variable "Uhrzeit" und eine Prozedur deklariert werden:
Delphi-Quellcode:
uhrzeit: string;
procedure clacTime;
Anschließend kann diese Prozedur hinzugefügt werden:
Delphi-Quellcode:
procedure TForm1.calcTime;
var
  std, min, sec, msec : word;
  stdstr, minstr, secstr{, msecstr} : string;
begin
  DecodeTime(Time, std, min, sec, msec);
  stdstr := IntToStr(std);
  if length(stdstr) < 2 then stdstr := '0' + stdstr;
  minstr := IntToStr(min);
  if length(minstr) < 2 then minstr := '0' + minstr;
  secstr := IntToStr(sec);
  if length(secstr) < 2 then secstr := '0' + secstr;
  uhrzeit := stdstr + ':' + minstr + ':' + secstr;
  {msecstr := IntToStr(msec);
  Case length(msecstr) of
    1: msecstr := '00' + msecstr;
    2: msecstr := '0' + msecstr;
  end;
  uhrzeit := uhrzeit+','+msecstr;}
// Die Klammern entfernen, wenn die Zeit mit Millisekunden ausgegeben werden soll.
end;
Um jetzt z.B. die Zeit von einem Timer aus über das Label1 anzeigen zu lassen, ist nur noch folgender Code notwendig:
Delphi-Quellcode:
clacTime;
Label1.Caption := Uhrzeit;
Code zum Ausgeben des Datums:
Es müssen erneut ein paar Dinge deklariert werden:
Delphi-Quellcode:
lokalDatum: string;
procedure calcDate;
Die Prozedur sieht folgendermaßen aus:
Delphi-Quellcode:
procedure TForm1.calcDate;
var
  jahr, monat, tag : word;
  jahrstr, monatstr, tagstr : string;
begin
  DecodeDate(Date, jahr, monat, tag);
  jahrstr := IntToStr(Jahr);
  Case length(jahrstr) of
    1: jahrstr := '000' + jahrstr;
    2: jahrstr := '00' + jahrstr;
    3: jahrstr := '0' + jahrstr;
  end;
  monatstr := IntToStr(monat);
  if length(monatstr) < 2 then monatstr := '0' + monatstr;
  tagstr := IntToStr(tag);
  if length(tagstr) < 2 then tagstr := '0' + tagstr;
  lokaldatum := tagstr + '.' + monatstr + '.' + jahrstr;
end;
Die Verwendung ist völlig analog zur Uhrzeit.

[edit=Matze]Code formatiert. Mfg, Matze[/edit]

Tom 17. Jul 2003 08:34

Re: Uhrzeit und Datum regionsunabhängig ausgeben
 
Zitat:

Zitat von daniel-volk
Jeder, der schon einmal in einem Programm mit Daten und Uhrzeiten gearbeitet hat, kennt das Problem.

Ich kenne das Problem nicht, da ich Datums- und Zeitangaben als Zahl speicher. Angezeigt bekommt der Anwender diese gemäß seinen Systemeinstellungen.

Zitat:

Der folgende Algorithmus gibt grundsätzlich die aktuelle Zeit im Format HH:mm:ss und das aktuelle Datum im Format TT.MM.JJJJ aus. Völlig unabhängig von der Region. (Beispiel: 08:55:30 17.07.2003)
Wie wäre es mit
Delphi-Quellcode:
ShowMessage( FormatDateTime( 'HH:mm:ss dd.mm.yyyy', Now ));
Oder habe ich da etwas falsch verstanden?

MathiasSimmack 17. Jul 2003 09:46

Re: Uhrzeit und Datum regionsunabhängig ausgeben
 
Oder noch einfacher:
Delphi-Quellcode:
ShowMessage(FormatDateTime('',Now));
Dadurch wird automatisch die Systemeinstellung benutzt.

daniel-volk 17. Jul 2003 13:40

Re: Uhrzeit und Datum regionsunabhängig ausgeben
 
Zitat:

Zitat von Tom
Wie wäre es mit
Delphi-Quellcode:
 
ShowMessage( FormatDateTime( 'HH:mm:ss dd.mm.yyyy', Now ));

Dazu kann ich leider nichts sagen, da ich diesen Code bis jetzt noch nie verwendet habe. Aber schreib doch einfach mal auf, wie du mit Datum und Zeit (als Zahlen) arbeitest. Es ist immer sinnvoll sein Wissen mitzuteilen!

Zitat:

Zitat von MathiasSimmack
Oder noch einfacher:
Delphi-Quellcode:
ShowMessage(FormatDateTime('',Now));
Dadurch wird automatisch die Systemeinstellung benutzt.

Hier hast du was falsch verstanden. Wie die Zeit mit den aktuellen Systemeinstellungen ausgegeben wird, das habe ich bereits gesagt. Es geht hier ja gerade darum, dass die Systemeinstellungen unterbunden werden sollen!

MathiasSimmack 17. Jul 2003 14:13

Re: Uhrzeit und Datum regionsunabhängig ausgeben
 
Zitat:

Zitat von daniel-volk
Hier hast du was falsch verstanden. Wie die Zeit mit den aktuellen Systemeinstellungen ausgegeben wird, das habe ich bereits gesagt.

Nicht wirklich. Du hast nur was von landesüblichen Einstellungen erzählt, aber nicht wie man sie auch so ausgibt.

Zitat:

Es geht hier ja gerade darum, dass die Systemeinstellungen unterbunden werden soll.
Warum eigentlich? Der Anwender wird sich doch sicher was dabei gedacht haben, dass er einen bestimmten Stil bevorzugt. Mein Datumsformat sieht bspw. so aus: YY-MM-TT. Macht es einen guten Eindruck, wenn dein Programm das ignoriert und deine bevorzugte Darstellung benutzt?

Aber in jedem Fall kommst du mit dem Tipp von Tom besser weg als mit deiner selbstgeschriebenen Funktion. Sorry, is´ aber so.

Tom 17. Jul 2003 23:20

Re: Uhrzeit und Datum regionsunabhängig ausgeben
 
Zitat:

Zitat von daniel-volk
Dazu kann ich leider nichts sagen, da ich diesen Code bis jetzt noch nie verwendet habe.

Dann wird es Zeit.

Zitat:

Aber schreib doch einfach mal auf, wie du mit Datum und Zeit (als Zahlen) arbeitest.
Falls man z.B. Zeitangaben als Strings speichern möchte:
Delphi-Quellcode:
var Termin : TDateTime; // var als Beispiel
...
... := FloatToStr( Termin ); // Ein String zum Speichern
Termin := StrToFloatDef( ..., Now ); // Aus String wieder auslesen

FriFra 19. Jul 2003 14:49

Re: Uhrzeit und Datum regionsunabhängig ausgeben
 
Also ich würde auch sagen, dass FormatDateTime hier eindeutig der bessere Weg ist, Man kommt damit ja auch problemlos an die entspr. Zahlenwerte, sofern man diese benötigt

z.B.
Delphi-Quellcode:
Hour := StrToInt(FormatDateTime('hh', Now));
Allerdings sollten die Trennzeichen im Formatstring immer in " stehen, da diese sonst ersetzt werden können (habe ich schon mehrfach beobachtet!):
Delphi-Quellcode:
DateStr := FormatDateTime('mm"/"dd"/"yyyy', Now)
Bei 'mm/dd/yyyy' kann nämlich z.B. '12.31.2002' herauskommen!


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