Inhaltsverzeichnis

Datumseingabe

Im folgenden Text stehen die Größen $Y,M,D$ für die ganzzahligen Werte von Jahr, Monat und Tag.

Es ist zu beachten, dass es einen Unterschied in der Zählweise der Jahre gibt:

  • Historische Zählweise: Auf das Jahr 1 v.Chr. folgt direkt das Jahr 1 n.Chr. Es gibt kein Jahr Null.
  • Astronomische Zählweise: Es gibt ein „Jahr 0“, also einen Zeitraum 1.1.0000 bis 31.12.0000

Die astronomische Verwendung eines Jahres Null und negativer Jahre ist die einzige, die für arithmetische Zwecke geeignet ist. Dies lässt sich anhand folgender Beispiele zeigen:

$$24 - ( -43) = 24 + 43 = 67\;\textrm{Jahre}$$

Schaltjahr

In der Kalenderrechnung, auch Computus („Rechnen mit Zeit“) genannt, wurde unter Julius Cäsar eine Schaltjahres-Regel eingeführt und von Augustus vollendet.

Die Regel lautet: Alle Jahre,

werden Schaltjahre genannt. Diese Jahre sind genau ein Tag länger als die Gemeinjahre. Der kürzeste Monat Februar erhält am Monatsende einen Tag mehr, um die Differenz zwischen dem siderischen Jahr und dem tropischen Jahr aufzufangen.

Beispiel für JavaScript

Die Funktion isLeap übernimmt eine Jahreszahl und gibt bei einem Schaltjahr 1 zurück, bei einem Gemeinjahr hingegen 0. Der Parameter ist die Ganzahl des gegebenen Jahres $Y$.

// Schaltjahr berechnen (ja/nein)
function isLeap(Y) {
  if(Y > 1582) {
    // Gregorianischer Kalender
    return ((Y % 4 == 0 && J % 100 != 0) || Y % 400 == 0) ? 1 : 0;
  }
  else {
    // Julianischer Kalender
    return (Y % 4 == 0) ? 1 : 0; 
  }
}

Monatsname

Es wird ein Monat $M$ aus der Tabelle ausgewählt, der zwischen 1 und 12 liegt.

Tabelle 1
Nummer $M$ Monatsname Monatslänge $N$
1 Januar 31
2 Februar 28*
3 März 31
4 April 30
5 Mai 31
6 Juni 30
7 Juli 31
8 August 31
9 September 30
10 Oktober 31
11 November 30
12 Dezember 31

Der mit dem * gekennzeichnete Monat ist der Schaltmonat. In einem Schaltjahr hat er dann 29 Tage.

Wahl des Tages

Der Tag $D$ liegt zwischen 1 und der Länge des Monats $N$.

Der Julianische Tag JD

Der Julianischer Tag JD wird aufgrund seines Umfangs in einem eigenen Kapitel behandelt.

Wochentage

Der Julianische Tag wird auf Betrag zwischen 0 und 7 reduziert. Diesem Wert wird der Name eines Wochentags (Tabelle) zugeordnet.

\[\begin{align} \mathrm{wt} =&\;\mathrm{red}[{(\mathrm{round}(\mathrm{red}(JD,7) + 1),0),7}] \\ =&\; \mathrm{red}({JD + 1.5, 7}) + 1 \end{align}\tag{1}\]

Tabelle 2
wt Wochentag
0 Sonntag
1 Montag
2 Dienstag
3 Mittwoch
4 Donnerstag
5 Freitag
6 Samstag
7 $\hat{=}$ 0 Sonntag

Die Reduktionsfunktion red(…) und die Rundungsfunktion round(…) findet man im Kapitel Mathematische Grundlagen.

Jean Meeus gibt in seinen Astronomical Algorithms folgende Vorgehensweise an, um den Wochentag zu ermitteln:

Beispiel

 Man ermittle den Wochtag für den 15.4.2023.

Der Julianische Tag für dieses Datum wurde bereits in Beispiel 1 ermittelt. Für 00:00 $UT$ lautet das Ergebnis $JD = 2460049.5$

Es ist nun

$$\frac{2460049.5 + 1.5}{7} = 351435,\;\text{Rest}\;6$$

und der 15.4.2023 ist daher ein Samstag.

Der ganzzahlige Rest einer Division lässt sich in diversen Programmiersprachen mit der Modulo-Funktion ermitteln. Der Operator, auch genannt Restwert-Operator, kann sich dabei unterscheiden:

  • In Java/JavaScript ist der Operator das &: $10\;\textsf{&}\;3 = 1$ (10:3 = 3, Rest 1)
  • In Python ist der Operator ebenfalls &.
  • In PHP lautet der Operator %.

Tagesnummer des Jahres

Die Tagesnummer $Z$ gibt die Summe der Tage vom Jahresbeginn bis zum gegegeben Tag des Jahres an.

$Z$ liegt zwischen 1 bis 365 (bzw. 366 in einem Schaltjahr). Es gilt:

$$Z = \sum_{M = 1}^{13} N\cdot(M - 1) + D\tag{2}$$

Dabei ist $N$ ist die Anzahl der Tage in jedem Monat. In einigen Fällen ist es notwendig, diese Tagesnummer eines gegebenen Jahres zu ermitteln. Dabei ist zwischen Gemeinjahren und Schaltjahren zu unterscheiden. Der Tag $1$ jedes Monats entpricht der folgenden Tagesnummer:

Tabelle 3
Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez
Gemeinjahr 0 31 59 90 120 151 181 212 243 273 304 334
Schaltjahr 0 31 60 91 121 152 182 213 244 274 305 335

Die Tabelle beginnt die Zählung jeweils bei $0$, da der Tag $D$ des aktuellen Monats noch addiert wird:

Beispiel für JavaScript

Folgender Beispielcode enthält die Funktion isLeap, die ermittelt, ob ein Schaltjahr vorliegt oder nicht. Diese Funktion wurde bereits weiter oben vorgestellt.

function getDayOfYear(Y, M, D) {
  const firsts = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
  if(isLeap(Y)) {
    // Für Schaltjahre: März bis Dezember um 1 erhöhen.
    let i = firsts.length;
    while(i-- > 2) {
      firsts[i] += 1;
    }
  }
  return firsts[M - 1] + D;
}
console.log(getDayOfYear(2023, 6, 16));  // => 167
console.log(getDayOfYear(2024, 10, 24)); // => 298
// Test für 1. März
console.log(getDayOfYear(2023, 3, 1));   // => 60
console.log(getDayOfYear(2024, 3, 1));   // => 61
// Test für 31. Dezember
console.log(getDayOfYear(2023, 12, 31)); // => 365
console.log(getDayOfYear(2024, 12, 31)); // => 366

Einen eleganteren Weg zeigt J. Meeus auf, die folgende Funktion ermittelt ebenfalls die Tagesnummer im Jahr. Die Parameter lauten wie in der obigen Funktion Y, M, D. Auch hier wird die Funktion isLeap verwendet.

Beispiel für JavaScript

function getDayOfYear(Y, M, D) {
  let k = isLeap(Y) ? 1 : 2;
  return Math.floor((275*M)/9) - k*(Math.floor((M + 9)/12)) + D - 30;
}
console.log(getDayOfYear(2023, 6, 16));   // => 167
console.log(getDayOfYear(2024, 10, 24));  // => 298

Jahr in dezimaler Darstellung

Mithilfe den beiden oben genannten Funktionen isLeap und getDayOfYear lässt sich ein beliebiges Datum nun als „dezimale Jahreszahl“ darstellen. Man ermittelt die Tagesnummer des Jahres und addiert dann den entsprechenden Bruchteil (Gemeinjahr/Schaltjahr) zum gegebenen Jahr (Integer!). Die dezimale Jahreszahl ist z.B. bei der Ermittlung der Mondphasen und der Aspekte der Planeten von Nutzen.

$$J = Y + \frac{Z}{365 + Q}\tag{3}$$

$Q = 0$ im Normaljahr und $Q = 1$ im Schaltjahr. $J$ ist dann das Jahr in Dezimalform.

Beispiel für JavaScript

function getDecimalYear(Y, M, D) {
  const days = isLeap(Y) ? 366 : 365;
  let doy = getDayOfYear(Y, M, D) - 1;
  return Y + (doy/days);
}
console.log(getDecimalYear(2023, 6, 16));   // => 2023.454794520548
console.log(getDecimalYear(2024, 10, 24));  // => 2024.811475409836
// 1. Januar 00:00 Uhr
console.log(getDecimalYear(2024, 1, 1));    // => 2024
// 31. Dezember 00:00 Uhr
console.log(getDecimalYear(2024, 12, 31));  // => 2024.9972677595629