AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Wochentagsbestimmung klassisch und plattformunabhängig

Wochentagsbestimmung klassisch und plattformunabhängig

Ein Thema von Wolfgang Mix · begonnen am 7. Mär 2010 · letzter Beitrag vom 8. Mär 2010
Antwort Antwort
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#1

Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 7. Mär 2010, 18:55
Am häufigsten wird der Algorithmus von Zeller verwendet.
Dieser ist auch in den meisten Betriebssystemen implementiert.
Die Ergebnisse liefern die sogenannte "voreilende" Zählung
mit Samstag=0, Sonntag = 1 usw.

Von vielen weiteren Kalenderformeln ist der Algorithmus von
Robertson für den gregorianischen Kalender hervorzuheben,
da er sehr einfach ist. Die Ergebnisse liefern die früher
übliche "normale" Zählung mit So=0, Mo=1 usw.
Wer es ISO-konform mag, kann jeweils noch eine Case-Struktur
hinterherschieben.

Die nach Delphi umgesetzten Codeschnippsel:

Delphi-Quellcode:
function wt_zellergreg(d,m,y:integer):integer;
var century,year:integer;
begin
  if (m<3) then
  begin
    m:=m+12;
    y:=y-1;
  end;
  century := y div 100;
  year := y mod 100;
  result:= (d + ((m+1)*26) div 10 + year + year div 4
              + century div 4 + 5*century) mod 7;
  //Samstag:=0;Sonntag=1
end;

function wt_zellerjul(d,m,y:integer):integer;
var century,year:integer;
begin
   if m<3 then
   begin
     m:=m+12;
     y:=y-1;
   end;
   century := y div 100;
   year := y mod 100;
   result:=(d + ((m+1)*13 div 5) + year + year div 4
              + 5 + 6 * century) mod 7;
  //Samstag:=0;Sonntag=1
end;

function WT_Robertson(T,M,J:integer):integer;
var A,B,C,D,E:integer;
Begin
  A:=M+10;
  B:=(M-14) div 12 + J;
  C:=A-12*A div 13;
  D:=(13*C-1) div 5;
  E:=5*(B mod 100) div 4;
  result:=(D+T+77+E+B div 400 - 2*(B div 100)) mod 7;
  //Sonntag =0; Montag=1
end;

procedure TForm1.Button1Click(Sender: TObject);
var dd,mm,yy:integer;
begin
  dd:=StrToInt(Spinedit1.Text);
  mm:=StrToInt(Spinedit2.Text);
  yy:=StrToInt(Spinedit3.Text);
  Edit1.Text:=IntToStr(wt_zellerjul(dd,mm,yy));
end;

procedure TForm1.Button2Click(Sender: TObject);
var d,m,y:integer;
begin
  d:=StrToInt(SpinEdit1.Text);
  m:=StrToInt(SpinEdit2.Text);
  y:=StrToInt(SpinEdit3.Text);
  Edit1.Text:=IntToStr(wt_zellergreg(d,m,y));
end;


procedure TForm1.Button3Click(Sender: TObject);
var d,m,y:integer;
begin
  d:=StrToInt(SpinEdit1.Text);
  m:=StrToInt(SpinEdit2.Text);
  y:=StrToInt(SpinEdit3.Text);
  Edit1.Text:=IntToStr(WT_Robertson(d,m,y));
end;

end.
Wolfgang Mix
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 7. Mär 2010, 19:21
Mal ganz ehrlich, wozu braucht man so etwas in der Codelib? Delphi liefert doch mindestens eine der Varianten bereits mit. Ich persönlich habe das Gefühl das du ab und an die Delphihilfe aufschlägst, dir per Zufall eine Funktion heraus suchst, diese nachprogrammierst und dann hier in die Codelib stellen willst.
Ich dachte in die Codelib sollen Sachen die nicht bereits mit Delphi ausgeliefert werden.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 7. Mär 2010, 19:32
Anders herum!
Schau dir mal bitte genauer an, wie umständlich Borland/Embarcadero
das gelöst haben.
Ich wette zusätzlich, dass die Klassiker schneller sind.

Die DateUtils von z.B D7 machen das umständlicher

Delphi-Quellcode:
function DayOfTheWeek(const AValue: TDateTime): Word;
begin
  Result := (DateTimeToTimeStamp(AValue).Date - 1) mod 7 + 1;
end;
Verfolgt das mal weiter

Viel Spass


Gruß

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#4

Re: Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 8. Mär 2010, 12:31
Zitat von SirThornberry:
Mal ganz ehrlich, wozu braucht man so etwas in der Codelib? Delphi liefert doch mindestens eine der Varianten bereits mit.
Z.B. für die Leute, die noch mit Delphi5,4,3... vorlieb nehmen müssen, und denen viele Funktionen fehlen, die erst in den späteren Versionen verfügbar waren.
Ausserdem finde ich es gut, wenn in der Codelib die Delphi-Umsetzung von mehr oder weniger bekannten Algorithmen zu finden sind.

Vor ein paar Wochen mußte ich den Zeller nachbauen, da wär es schön gewesen wenn ich da etwas in der Codelib gefunden hätte.
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.378 Beiträge
 
#5

Re: Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 8. Mär 2010, 14:57
Zitat von p80286:
Vor ein paar Wochen mußte ich den Zeller nachbauen, da wär es schön gewesen wenn ich da etwas in der Codelib gefunden hätte.
Gruß
K-H
Und warum schlägst dus dann nicht für die CL vor, wenn du denkst, dass das da fehlt?
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#6

Re: Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 8. Mär 2010, 15:47
Zitat von Daniel G:
Und warum schlägst dus dann nicht für die CL vor, wenn du denkst, dass das da fehlt? :gruebel:
Weil mein Geschreibsel weder OOP, noch schnell, noch effizent ist. Immer nur als abschreckendes Beispiel dienen ist auch nicht schön.

Gruß
K-H

edit:
Delphi-Quellcode:
function Wochentag(dt:tdatetime):integer; { Zellers Kongruenz}
var
  jahr,
  monat,
  tag : word;
  jahrh : word;
  d1,
  d2,
  d3,
  d4 : integer;
begin
  decodedate(dt,jahr,monat,tag);
  case monat of
    1,2 : begin
            monat:=monat+12;
            jahr:=jahr-1;
          end;
  end;
  jahrh:=(jahr div 100)*100;
  d1:=(((monat+1)*26) div 10);
  d2:=(jahr mod 100)+((jahr mod 100) div 4);
  d3:=((jahrh div 4)-(2*jahrh));
  d4:=d1+d2+d3+tag ;
  if d4<0 then
    result:=(d4 mod 7)+7
  else
    result:=d4 mod 7;
end;
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Wochentagsbestimmung klassisch und plattformunabhängig

  Alt 8. Mär 2010, 17:38
Ich würde mich nicht entmutigen lassen!

Sobald du hier einen suboptimalen Code im Forum vostellst,
stürzen sich die Exoerten darauf und wollen helfen zu optimieren.
Das ist normal und ist mir hier schon öfter passiert. Ich habe
vieles daraus gelernt. Ich code erst 1 Jahr in Delphi und nehme
fast jeden Verbesserungsvorschlag an, um voran zu kommen.
Selbst Luckie (30.000 Beiträge) ] hat letzte Woche hier einen Beitrag
gepostet und gezeigt, dass man unter Zeitdruck eigentlich nur
schlechten Code erzeugen kann.

Blamieren kann man sich hier eigentlich nicht, es sei denn,
man ist geouteter Lehrer

Gruß

Wolfgang
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf