Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Wann fällt ein Datum wieder auf den gleichen Wochentag? (https://www.delphipraxis.net/189966-wann-faellt-ein-datum-wieder-auf-den-gleichen-wochentag.html)

Wolfgang Mix 14. Aug 2016 12:22

Wann fällt ein Datum wieder auf den gleichen Wochentag?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Diese Frage wurde einmal in der „Hörzu“ Feb. 1977 gestellt und vom Verlag mit einem Algorithmus beantwortet, den Ihr im Anhang findet. Vlt. hat ja jemand Lust, den zu coden und für 1900..2099 zu testen. Mein Windoof-PC will im Moment nicht. Die Quelle verdanke ich einem Leser.

Liebe Grüße
Wolfgang Mix

DeddyH 14. Aug 2016 12:39

AW: Wann fällt ein Datum wieder auf den gleichen Wochentag?
 
Nur schnell heruntergetippt, weder optimiert noch getestet:
Delphi-Quellcode:
function NextDateWithSameWeekday(const aDate: TDate): TDate;
var
  y, m ,d: word;
begin
  DecodeDate(aDate, y, m, d);
  if (m = 2) and (d = 29) then
    inc(y, 28)
  else
    begin
      case y mod 4 of
        0:
          if m in [1, 2] then
            inc(y, 5)
          else
            inc(y, 6);
        1:
          inc(y, 6);
        2:
          if m in [1, 2] then
            inc(y, 6)
          else
            inc(y, 11);
        else
          if m in [1, 2] then
            inc(y, 11)
          else
            inc(y, 5);
      end;
    end;
  Result := EncodeDate(y, m, d);
end;

Wolfgang Mix 14. Aug 2016 12:49

AW: Wann fällt ein Datum wieder auf den gleichen Wochentag?
 
Das ist erst die halbe Miete. Das ist das, was man per Hand macht. Fehlt noch der Beweis, dass die Daten für meinen gewünschten Zeitraum auch stimmen.

Uwe Raabe 14. Aug 2016 14:30

AW: Wann fällt ein Datum wieder auf den gleichen Wochentag?
 
Die Überprüfung könnte brute force so aussehen:

Delphi-Quellcode:
var
  aDate: TDateTime;
begin
  aDate := EncodeDate(1900, 1, 1);
  while aDate < EncodeDate(2100, 1, 1) do begin
    if DayOfWeek(aDate) <> DayOfWeek(NextDateWithSameWeekday(aDate)) then begin
      raise Exception.Create('Passt nicht!');
    end;
    aDate := IncDay(aDate);
  end;
end;
Man sollte dabei beachten, daß die berechneten Werte am Ende über den betrachteten Zeitraum hinausgehen.

Alternativ kann man aber auch einen Algorithmus nehmen, der die Korrektheit garantiert:

Delphi-Quellcode:
function NextDateWithSameWeekday(const aDate: TDate): TDateTime;
var
  day: Word;
  dow: Integer;
  month: Word;
  year: Word;
begin
  dow := DayOfWeek(aDate);
  DecodeDate(aDate, year, month, day);
  repeat
    Inc(year);
    if not TryEncodeDate(year, month, day, result) then Continue
  until dow = DayOfWeek(result);
end;


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