Diskussion:Zellers Kongruenz

message: Habe um dieses Beispiel ergänzt, weil ich selbst lange nach einer Implementierung in C gesucht habe.
Ich möchte diese Funktion auch anderen interessierten Personen zur Verfügung stellen.
int dayofweek(int d, int m, int y)
{ 
  // gibt Wochentag zurück                             
  // 1  = Sonntag, 2 = Montag, ... , 7 = Samstag       
  // 0  = Datum ungültig z.B. 29.2.2007, 32.12.2007    
  // auch julianischer Kalender wird berücksichtigt
  int s,mtag[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 
  if (y<1 || y>10000) return(0);
  if (m<1 || m>12) return(0);
  // verbotener Bereich 5.10. - 14.10.1582
  if (y==1582 && m==10 && d>4 && d<15) return(0);
  if (y>1582 || (y==1582 && m>10) || (y==1582 && m==10 && d>14))
  { // gregorianisch ab 15.10.1582
    if ((y % 4==0 && y % 100!=0) || y % 400==0) mtag[2]=29;
    if (d<1 || d>mtag[m]) return(0); 
    if (m < 3) { m += 13; y--; } else  m++; 
    s = d + 26*m/10 + y + y/4 - y/100 + y/400 + 6; 
  }
  else  // julianisch
  {  
    if (y % 4==0) mtag[2]=29; 
    if (d<1 || d>mtag[m]) return(0); 
    if (m < 3) { m += 13; y--; } else  m++; 
    s = d + 26*m/10 + y + y/4 + 4; 
  }
  return(s % 7 + 1);
}
und es geht sogar noch kürzer:
int dayofweek(int d, int m, int y)
{ 
  int s = m % 2; if (m==2) s-=2; if (m>7) s=1-s;
  if (m==2 && !(y % 4)) {s++; if (y>1582 && !(y % 100) && y % 400) s--;}
  if (y<1 || y>10000 || m<1 || m>12 || d<1 || d>s+30 ||
     (y==1582 && m==10 && d>4 && d<15)) return(0);
  if (m++ < 3) {m += 12; y--;}
  s = d + 26*m/10 + y + y/4 + 4;  // julianisch
  if (y>1582 || (y==1582 && m>11) || (y==1582 && m==11 && d>14))
     s += y/400 - y/100 + 2;      // gregorianisch ab 15.10.1582
  return(s % 7 + 1);
}
-- Fraba 18:00, 13. Dez. 2010 (CET)
thread_title:  Beispiel in der Programmiersprache C 

message: Bei mir funktioniert die angegebene Formel nicht bei allen Daten...
Ich habe zwei Dinge zur Korrektur eingeführt:
Für den Januar, Februar und März muss das Jahr um eins verringert werden (1.1.2005 ist z.B. ein Samstag und nicht (wie nach der Formel hier) ein Sonntag) und wenn das Ergebnis kleiner als Null ist, muss man Sieben zum Ergebnis addieren (1.3.2005 ist nicht -5 sondern ein Dienstag).
Stimmt das? Oder mache ich sonst irgendwas falsch?
----
Bitte beachte den Kommentar zur Monatszahl M:
"Zur einfacheren Berechnung des Wochentags beginnt das Jahr mit dem März, d.h. für den März ist M = 1, für April ist M = 2, ..., für Dezember ist M = 10. Januar und Februar sind der 11. bzw. 12. Monat des Vorjahres. Das Jahr J ist dann auch um Eins zu reduzieren"
Für den 1.1.2005 ist also M=11, T=1, J=4 und JH=20 in die Formel einzusetzen:
Wt = \left(\lfloor(26*11-2)/10\rfloor + 1 + 4 + \lfloor 4/4\rfloor + \lfloor 20/4\rfloor - 2*20\right) \bmod\, 7
Wt = \left(28 + 1 + 4 + 1 + 5 - 40\right) \bmod\, 7
Wt = \left(-1\right) \equiv\,6\, \bmod\, 7
Für den 1.3.2005 ist M=1, T=1, J=5 und JH=20 in die Formel einzusetzen:
Wt = \left(\lfloor(26*1-2)/10\rfloor + 1 + 5 + \lfloor 5/4\rfloor + \lfloor 20/4\rfloor - 2*20\right) \bmod\, 7
Wt = \left(2 + 1 + 5 + 1 + 5 - 40\right) \bmod\, 7
Wt = \left(-26\right) \equiv\, -5\equiv\, {2}\,\bmod\, 7
--Eljots 23:45, 1. Mär 2005 (CET)
thread_title:  Korrekturen? 

message: Ich habe den Artikel nochmals überarbeitet, so dass er dem von Zeller (1886) veröffentlichten näher kommt. --Eljots 23:27, 13. Mär 2005 (CET)
thread_title:  Anpassung an die Originalveröffentlichung 

message: My apologies : I can just about read German, but I cannot write it.
That is a bad algorithm, because it ALWAYS calculates s, but s is needed only if m==2 and d==29.
Google Translate : 
Meine Entschuldigung: Ich kann nur über die Deutsch lesen, aber ich kann nicht schreiben. 
Das ist ein schlechter Algorithmus, da es IMMER berechnet s, aber s ist nur erforderlich, wenn m==2 und d==29.
82.163.24.100 14:10, 8. Apr. 2008 (CEST)
thread_title:  Verwendung in Programmiersprachen  

message: Das Bild trägt die Unterschrift "gültig ab 01". Da im Bild selbst die "Jahrhunderte" ab 1 numeriert sind, nehme ich an, dass tatsächlich die Zeit seit Christi Geburt abgedeckt sein soll. Wenn dem wirklich so ist, lautet mein Vorschlag, die Bildunterschrift auf "0001" statt "01" zu ändern, da man bei 01 genauso an 1901 oder 2001 denken könnte, das ist arg mehrdeutig. --PeterFrankfurt 01:27, 7. Mär. 2010 (CET)
replies: text: Also wenn ich "01" lese, komme ich nur ins Meditieren, ob 1901 oder 2001 gemeint sein könnte. Auf 0001 komme ich erstmal gar nicht. Die Schreibweise mit den Vornullen wäre aber so ungewöhnlich, dass sie doch sehr schnell in diese Richtung lenken würde, ohne dass man erst näher den Inhalt studieren müsste. Und überhaupt: wieso dann eigentlich 01 und nicht gleich einfach 1? Das erschiene mir eher klarer. --PeterFrankfurt 01:00, 11. Mär. 2010 (CET)
thread_title:  Letztes Bild 

message: die Mitteilung, auf welchen Tag der 1.1.1472 fiel. Danke! --Claus Diskussionsseite   15:24, 30. Mai 2011 (CEST)
thread_title:  Bitte um .... 

message: Diese neu eingefügten, riesigen Bilder mit den ewigen Kalendern zerkloppen den ganzen Artikel. Sie haben einen eigenen Artikel, hier gehören sie nur als absoluter Nebenaspekt dazu, diese Ausführlichkeit, die alles andere erschlägt, ist also unangebracht. Eine einfache Verlinkung beim Hinweis, dass sie zur Kontrolle herangezogen werden können, sollte doch wohl reichen. Sprich: Ich möchte die gelöscht sehen. --PeterFrankfurt 03:55, 5. Jan. 2012 (CET)
thread_title:  Ewige Kalender 

message: weberlars.tata@gmail.com
Ich verstehe nicht genau, wieso muss man so umständlich erklären wie man einen Wochentag berechnet!
Wenn das Jahr, Monat und Tag gegeben ist und nehmt an, das die auch richtig sind (validiert), dann kann man einfach mit dem  Formeln den Wochentag berechnen:
Vorher aber treffen wir Ein-Paar Kleinigkeiten:
MOD       ist Modulo (Rest einer Division)
INT       ist das Ganzteilige Teil von Division
Jahr      ist das Jahr in Ganzen nicht aufgeteilt in Jahrhundert und so
Monat     ist Monat. Wenn Monat Jan (01) oder Feb (02) gemeint ist dann  wird Monat +12 aufadiert und gleizeitig das Jahr (-1) subtrahiert.
0=Sonntag, 1=Montag, 2=Dienstag usw...
----------------------------------------------
Also:
IF monat<3 THEN monat+12 AND jahr-1
(jahr + INT(jahr/4) - INT(jahr/100) + INT(jahr/400) + INT((660*monat-1296)/256) + tag) MOD 7
-----------------------------------------------
Beispiel: 13.05.2013 ist 1 also Montag
2013+503-20+5+(5*660-1296)/256+13=
2501+7+13=2521
2521 MOD 7 = 1
Beispiel: 08.02.1907 ist 5 also Freitag
Monat<3 also Monat+12 und Jahr-1 !!!
1906+476-19+4+(14*660-1296)/256+8=
2367+31+8=2406
2406 MOD 7 = 5
--188.156.108.243 23:29, 13. Mai 2013 (CEST)
thread_title:  Wochentag berechnen "Webers Formeln"