Spielereien mit Datum und Zeit in Delphi

Heute möchte ich den Programmierern unter euch, die noch mit Delphi arbeiten, eine kleine Auswahl an nützlichen Funktionen vorstellen, die man im Großen und Ganzen für die Bearbeitung von Datum und Zeit nutzen kann.

So finden Sie hier z.B. Funktionen, um ein Datum in seine Bestandteile zu zerlegen, um die Differenz zwischen zwei Datumswerten zu berechnen oder einfach um zu testen ob ein Datum innerhalb eines angegebenen Bereichs liegt. Diese Funktionen haben mir schon bei vielen Projekten die Arbeit sehr erleichtert und ich denke dass der eine oder andere sicher Verwendung dafür hat..

 

Ein Datum zerlegen in Minute, Stunde, Tag, Woche, Monat und Jahr
Folgende Funktion zerlegt das übergebene Datum in Minute, Stunde, Tag, Woche, Monat und Jahr.

uses
  DateUtils;

private
  procedure ExplodeDateTime(Datum: TDateTime);

procedure TForm1.ExplodeDateTime(Datum: TDateTime);
var
  wert : array of string;
begin
  SetLength(wert, 6);

  wert[0] := IntToStr(DayOf(Datum));
  wert[1] := IntToStr(WeekOfTheYear(Datum));
  wert[2] := IntToStr(MonthOf(Datum));
  wert[3] := IntToStr(YearOf(Datum));
  wert[4] := IntToStr(HourOf(Datum));
  wert[5] := IntToStr(minuteOf(Datum));

  Label1.Caption := wert[0];
  Label2.Caption := wert[1];
  Label3.Caption := wert[2];
  Label4.Caption := wert[3];
  Label5.Caption := wert[4];
  Label6.Caption := wert[5];
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ExplodeDateTime(now);
end;

 
 
Mit Datumswerten rechnen

uses
  DateUtils;

//Tage zu einem Datum hinzu addieren
function DatumPlusMinusTage(s:string;Tage:integer):TDate;
begin
  result:=strtodate(s) + Tage;
end;

//Einen Monat zu einemk Datum hinzu addieren
function DatumPlusMinusMonate(s:string;Monate:integer):TDate;
begin
  result:=incmonth(strtodate(s),Monate);
end;

//Ein Jahr zu einem Datum hinzu addieren
function DatumPlusMinusJahre(s:string;Jahre:integer):TDate;
var
  tag,monat,jahr:word;
begin
  decodedate(strtodate(s),jahr,monat,tag);
  inc(jahr,Jahre);
  result:=encodedate(jahr,monat,tag);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(datetostr(datumplusminustage('25.03.2012',10))); //Ausgabe = 04.04.2012
  showmessage(datetostr(datumplusminustage('27.02.2012',-57))); //Ausgabe = 01.01.2012
  showmessage(datetostr(datumplusminusmonate('30.01.2012',1))); //Ausgabe = 29.02.2012
  showmessage(datetostr(datumplusminusjahre('27.02.2012',3))); //Ausgabe = 27.02.2015
end;

 
 
Testen ob ein Datum innerhalb eines Bereiches liegt
Ein Beispiel, wofür man diese Funktion nutzen könnte, wäre z.B. folgendes.
Zum ermitteln bei Programmstart ob seit dem verschicken einer Rechnung eine bestimmte Anzahl an Tagen vergangen ist.
So kann man prüfen ob der Kunde mit der Zahlung im Verzug ist.

uses
  DateUtils;

function CheckDate(FromDate,BisDate:TDateTime;DaysBetweenCount:integer):boolean;
begin
  result := not (DaysBetween(FromDate,BisDate)>DaysBetweenCount);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  days  : Byte;
  d1, d2: TDate;
begin
  days := 3;
  d1   := strtodate('25.03.2012');
  d2   := now;

  if CheckDate(d1, d2, days) then
    ShowMessage('Es liegen weniger als '+inttostr(days)+' Tage zwischen dem '+datetostr(d1)+' und dem '+datetostr(d2)+'')
  else
    ShowMessage('Es liegen mehr als '+inttostr(days)+' Tage zwischen dem '+datetostr(d1)+' und dem '+datetostr(d2)+'')
end;

 
 
Anzahl der Tage zwischen zwei Datumswerten ermitteln
Diese Funktion kann z.B. dazu benutzt werden herauszufinden wie viele Tage es noch bis zum Geburtstag der Mutter sind.

uses
  DateUtils

procedure TForm1.Button1Click(Sender: TObject);
var
  tage : Integer;
  datum1, datum2: TDate;
begin
  datum1 := StrToDate('25.03.2012');
  datum2 := StrToDate('30.06.2012');
  tage   := DaysBetween(datum1, datum2);
  showmessage('Es liegen '+inttostr(tage)+' Tage zwischen dem '+DateToStr(datum1)+' und dem '+DateToStr(datum2));
end;

 
 
Den letzten Tag des aktuellen Monats ermitteln

function LastDayOfCurrentMonth: TDate;
var
  y, m, d: word;
begin
  decodedate(now, y, m, d);
  m := m + 1;
  if m > 12 then
  begin
   y := y + 1;
   m := 1;
  end;
  result := encodedate(y, m, 1) - 1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage('Der letzte Tage des aktuellen Monats ist der '+DateToStr(LastDayOfCurrentMonth));
end;

 
 
Datum und Zeit formatiert in einem String ausgeben
Mit dieser Funktion kann man ein Datum in folgender Schreibweise ausgeben.
23. März 2012 18:11:05

procedure TForm1.Button1Click(Sender: TObject);
begin
   Label1.Caption := FormatDatetime('d. mmmm yyyy  hh:mm:ss', Now);
end;

 
 
Zeit rückwärts laufen lassen und Aktionen ausführen
Diese Funktion kann man super dazu benutzen um z.B. den Computer nach einer bestimmten Zeit automatisch herunterzufahren.
Man übergibt der Funktion lediglich die Zeit wie lang der Counter laufen und nach wie vielen Minuten eine bestimmte Aktion ausgeführt werden soll.
Dies könnte z.B. eine Benachrichtigung sein, dass der Computer in 2 Minuten ausgeschaltet wird.

var
  Zeit : integer = 120; //60 x 60 Sekunden = 3600 Sekunden (1 Std)

procedure DoSomething;
begin
   Windows.Messagebox(0, pChar('Der Computer wird in '+IntToStr(Zeit)+' Minuten heruntergefahren!'),'ACHTUNG',
   MB_OK or MB_ICONINFORMATION);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  dec(Zeit);
  case Zeit of
    60 : DoSomething;
     0 : showmessage('Jetzt wird der Computer heruntergefahren');
  end;
  Label1.Caption := Format('%0.2d:%0.2d:%0.2d',[Zeit div 3600,Zeit div 60,Zeit mod 60]);
end;

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

Kommentare geschlossen.