Einzelnen Beitrag anzeigen

daniel-volk

Registriert seit: 16. Jul 2003
170 Beiträge
 
Delphi 6 Enterprise
 
#1

Uhrzeit und Datum regionsunabhängig ausgeben

  Alt 17. Jul 2003, 09:07
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]
  Mit Zitat antworten Zitat