Stefan Muenz: Jahre jenseits 1971-2037

Beitrag lesen

Hallo,

hat jemand mal kurz eine Formel oder einen Code zur Hand, wie man die Jahresdaten jenseits der Jahre 1971-2037 so in Jahre in diesem Zeitraum umwandeln kann, dass die Kalenderdaten (Wochentag des Jahresanfangs, Schaltjahr) stimmen?

Es gibt eine PEAR-Klasse dafuer. Ich hab selber auch mal irgendwann ein paar entsprechende Funktionen geschrieben, welche die noetigen Werte fuer solche Berechnungen liefern (ist halt weniger aufwaendig als die ganze PEAR-Klasse einzubinden). Die sind hier (Korrektheit natuerlich ohne Gewaehr *g*):

// ===========================================================
// Funktion: get_days_in_month()
// Parameter 'yyyy' und 'mm': Jahr und Monat, für die ein
// Ergebnis ermittelt werden soll. Das Jahr muss größer
// gleich 1800 sein.
// Zurückgegeben wird im Erfolgsfall ein Integer, der die
// Anzahl der Tage im Monat angibt.
// Im Fehlerfall wird boolean false zurückgegeben.
// ===========================================================
function get_days_in_month($yyyy, $mm) {
  if((int)$yyyy < 1800)
    return false;
  if((int)$mm < 1 or (int)$mm > 12)
    return false;
  return (int)$mm == 2 ? ((int)$yyyy % 4 ? 28 : ((int)$yyyy % 100 ? 29 : ((int)$yyyy % 400 ? 28 : 29))) : (((int)$mm - 1) % 7 % 2 ? 30 : 31);
}

// ===========================================================
// Funktion: get_days_in_year()
// Parameter 'yyyy': Jahr, für das ein ermittelt werden soll.
// Das Jahr muss größer gleich 1800 sein.
// Zurückgegeben wird im Erfolgsfall ein Integer, der
// entweder 365 oder 366 beträgt
// Im Fehlerfall wird boolean false zurückgegeben.
// ===========================================================
function get_days_in_year($yyyy) {
  if((int)$yyyy < 1800)
     return false;
  return(337 + get_days_in_month($yyyy, 2));
}

// ===========================================================
// Funktion: get_day_of_week()
// Parameter 'yyyy', 'mm' und 'dd': Jahr, Monat und Tag, für die
// ein Ergebnis ermittelt werden soll. Das Jahr muss größer
// gleich 1800 sein.
// Zurückgegeben wird im Erfolgsfall ein Integer, der den
// Wochentag anzeigt: 0 = Sonntag, 1 = Montag ... 6 = Samstag.
// Im Fehlerfall wird boolean false zurückgegeben.
// ===========================================================
function get_day_of_week($yyyy, $mm, $dd) {
  if((int)$yyyy < 1800)
    return false;
  if((int)$mm < 1 or (int)$mm > 12)
    return false;
  if((int)$dd < 1 or (int)$dd > get_days_in_month($yyyy, $mm))
    return false;
  $t = array(0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4);
  if($mm < 3)
    $yyyy -= 1;
  return ((int)$yyyy + (int)($yyyy/4) - (int)($yyyy/100) + (int)($yyyy/400) + $t[(int)$mm-1] + (int)$dd) % 7;
}

// ===========================================================
// Funktion: get_day_of_year()
// Parameter 'yyyy', 'mm' und 'dd': Jahr, Monat und Tag, für die
// ein Ergebnis ermittelt werden soll. Das Jahr muss größer
// gleich 1800 sein.
// Zurückgegeben wird im Erfolgsfall ein Integer, der die
// Tageszahl bezeichnet.
// Im Fehlerfall wird boolean false zurückgegeben.
// ===========================================================
function get_day_of_year($yyyy, $mm, $dd) {
  if((int)$yyyy < 1800)
    return false;
  if((int)$mm < 1 or (int)$mm > 12)
    return false;
  if((int)$dd < 1 or (int)$dd > get_days_in_month($yyyy, $mm))
    return false;
  $doy = 0;
  for($i = 0; $i < $mm; $i++)
    $doy += get_days_in_month($yyyy, $i);
  $doy += $dd;
  return($doy);
}

Diese Funktionen arbeiten rein mit Kalenderlogik und basieren nicht auf dem Unix-Zeitstempel. 1800 wurde in diesen Funktionen als fruehest moegliches Jahr festgelegt, weil die Kalenderreform eine ziemlich lange Geschichte war und sich nur zoegerlich durchsetzte. 1800 hatten noch laengst nicht alle Laender den gregorianischen Kalender. Sinnvoll waere es wahrscheinlich auch, eine Obergrenze zu bestimmen. Denn so weit ich mal gelesen habe, sollen im Jahr 2700 oder 2800 erstmals der gregorianische und der orthodoxe Kalender voneinander abweichen, da sie mit einer etwas unterschiedlichen Logik zur Sonnenjahrkorrektur arbeiten, die aber dann zum ersten mal zu einem Tag Unterschied fuehrt.

viele Gruesse
  Stefan Muenz