Delphi-Code at gokiburi.de

Doomsday


Inhalt: Freilich lässt sich der Wochentag eines vorgegebenen Datums auch viel einfacher ermitteln. Die Methode des Doomsday-Algorithmus' ist allerdings recht interessant und eignet sich auch dazu, den Wochentag im Kopf auszurechnen.
Sie funktioniert so: Der Algorithmus orientiert sich am Doomsday, das ist der Wochentag des letzten Februar-Tages eines Jahres. Sobald man den Doomsday eines Jahres kennt, lassen sich von diesem als Fixpunkt die Wochentage für alle anderen Tage des Jahres leicht berechnen. Zunächst benötigt man den Jahrhundert-Doomsday: a = Jahrhundert * 5; b = (Jahrhundert - 1) div 4; c = a + b; Doomsday = (c + 4) modulo 7; Für das 21. Jahrhundert erhält man als Ergebnis 2, also Dienstag.
Im nächsten Schritt berechnet man den Doomsday das Jahres: e = (Jahr modulo 100) div 12; f = (Jahr modulo 100) modulo 12; g = f div 4; h = e + f + g; Doomsday des Jahres = (h + Doomsday des Jahrhunderts) modulo 7; Für das Jahr 2010 ist dies ein Sonntag.
Im letzten Schritt wird die Zahl der Tage zwischen dem Datum und dem Doomsday berechnet. In Delphi dient dazu die Funktion daysBetween. Der gesuchte Wochentag = (Zahl der Tage + Doomsday des Jahres) modulo 7.

Nutzung: Geben Sie das gewünschte Datum in das Eingabefeld ein. Anschließend klicken Sie auf den Button "Wochentag berechnen".
Sie erhalten den Doomsday des Jahres und den Wochentag des Datums.

Version: 1.0.0.20

Größe: 535 KByte

Letzte Änderung: 10. September 2010

Download: doomsday.exe  Source: doomsday_source.zip

Mal heruntergeladen                   Mal heruntergeladen




Funktion: Das Programm berechnet des Wochentag eines vorgegebenen Datums.
Dazu verwendet es den Doomsday-Algorithmus.
function doomsday(datum: TDate): integer;
var century, anchor, a, b, c, e, f, g, h, dday : word;
begin
  decodeDate(datum, year, month, day);
  century := year div 100 + 1;
  a := century * 5;
  b := (century -1) div 4;
  c := a + b;
  anchor := (c + 4) mod 7;
  e := (year mod 100) div 12;
  f := (year mod 100) mod 12;
  g := f div 4;
  h := e + f + g;
  dday := (h + anchor) mod 7;
  result := dday;
end;

procedure TfrmMain.btDateClick(Sender: TObject);
var dday : TDate;
  i, tage, wochentag : integer;
  s, wd : string;
  fromdate, todate : TDate;
begin
  dday := dtpDatum.Date;;
  i := doomsday(dday);
  case i of
    0 : s := 'Sonntag';
    1 : s := 'Montag';
    2 : s := 'Dienstag';
    3 : s := 'Mittoch';
    4 : s := 'Donnerstag';
    5 : s := 'Freitag';
    6 : s := 'Samstag';
    else s := 'undefiniert';
  end;
  todate := EncodeDate(year, month, day);
  if IsLeapYear(year) then
    fromdate := EncodeDate(year, 2, 29)
  else
    fromdate := EncodeDate(year, 2, 28);
  tage := daysBetween(todate, fromdate);
  wochentag := (tage + i) mod 7;
  case wochentag of
    0 : wd := 'Sonntag';
    1 : wd := 'Montag';
    2 : wd := 'Dienstag';
    3 : wd := 'Mittoch';
    4 : wd := 'Donnerstag';
    5 : wd := 'Freitag';
    6 : wd := 'Samstag';
    else wd := 'undefiniert';
  end;
  lbResult.Visible := true;
  lbResult.Caption := 'Der Doomsday des Jahres ' + IntToStr(year) +
    ' ist ein ' + s + '.';
  lbWeekday.Visible := true;
  lbWeekday.Caption := 'Folglich ist der ' + DateToStr(dtpDatum.Date) +
    ' ein ' + wd + '.';
end;