JavaScript: Julian Date - Tag des Jahres - Tag der Woche

von Thomas Salvador.

Dieser Artikel setzt unsere Betrachtungen von Datum und Zeit in JavaScript fort und liefert Funktionen zur Berechnung des Julianischen Datms, eine allgemeine Tage des Jahres- und eine allgemeine Tag des Jahres-Funktion.

Julianisches Datum

Um aus dem gregorianischen Datum das julianische Datum zu bestimmen, können Sie folgendes Fragment benutzen:

function ymd2julian(y, m, d) {
  if (m < 3) {
    var f = -1;
  } else {
    var f = 0;
   return Math.floor((1461*(f+4800+y))/4)
    + Math.floor(((m-2-(f*12))*367)/12)
    - Math.floor(3*Math.floor((y+4900+f)/100)/4)
    + d
    - 32075;
  }
}

Beachten Sie bitte, dass ymd2julian() mit den 'normalen' Wertebereichen 1..12 für Monat und '4-stelligen Jahreszahlen', d.h. mit 1997 für 1997, arbeitet (97 ist hier das Jahr 97).

Wir schaffen noch eine Schnittstelle zur JavaScript-Darstellung:

function getJulian(t) {
  return ymd2julian(t4(t.getYear()),
                    t.getMonth()+1,
                    t.getDate());
}

Dabei ist t4() wieder eine kurze Hilfsfunktion, die – mit einer Annahme – Jahreszahlen vierstellig macht.

function t4(y) {
  return (y < 1000 ? y+1900 : y);
}

Denn eigentlich war getYear() so gedacht, dass sie Jahreszahlen 19xx zweistellig liefert und alle anderen vierstellig. Da hatte sich dann aber ein Fehler eingeschlichen, dass manche Browser es so machten, manche aber für 2000 den Wert 100 lieferten.

Daraufhin wurde die Bedeutung von getYear() allgemein geändert, dass sie stets Jahr-1900 liefert, entsprechend auch Werte größer 100 und kleiner 0.

Und es wurde eine neue Funktion getFullYear() eingeführt, die stets vierstellig liefert.

Entsprechend können Sie t4(t.getYear()) auch ersetzen mit t.getFullYear()) und nutzen dann:

function getJulian(t) {
  return ymd2julian(t.getFullYear()),
                    t.getMonth()+1,
                    t.getDate());
}

Beispiel:

<script type="text/javascript"><!--
  var now = new Date();
  document.write(now.toString(), ' ist auch bekannt als ',
                 getJulian(now));
//-->
</script>

liefert

Tag des Jahres

Mit Hilfe des julianischen Datums können wir eine allgemeine DOY (day of year) Routine implementieren:

function doy(y,m,d) {
  return ymd2julian(y,m,d)-ymd2julian(y,1,1)+1;
}

Es ist ein wesentlicher Vorteil der Julianischen Daten, dass Sie Rechnungen mit Daten sehr einfach machen.

Julianische Daten sind fortlaufend. Hat das heutige Datum das Julianische Datum a, so hat der morgige Tag das Julianische Datum a+1.

Nehmen wir nun das Julianische Datum des angefragten Datums dd.mm.yyyy und ziehen davon das Julianische Datum des 1. Januars des Jahres ab, in dem das Datum liegt, 01.01.yyyy, so bleibt der um Eins verminderte doy übrig.

Der erste Tag eines Jahres hätte so die Nummer 0, denn julian(01.01.yyyy) - julian(01.01.yyyy) ist 0.

Wir erhöhen also die Differenz einfach um Eins, um die Werte in die für uns gewohntere, bei Eins beginnende Zählweise zu bringen. Fertig ist unsere allgemeine Day-of-year-Funktion.

Auch hier eine Schnittstelle zu JavaScript:

function getDoy(t) {
  return doy(t4(t.getYear()), t.getMonth()+1, t.getDate());
}

oder alternativ

function getDoy(t) {
  return doy(t.getFullYear()), t.getMonth()+1, t.getDate());
}

Beispiel:

<script type="text/javascript"><!--
  var now = new Date();
  document.write(now.toString(), ' ist der ', getDoy(now));
  document.write('. Tag des Jahres ', (t4(now.getYear())));
//-->
</script>

liefert

Tag der Woche

Mit Hilfe des julianischen Datums können wir eine allgemeine DOW (day of week) Routine implementieren.

Der Unterschied zu getDay() liegt darin, dass die folgende Routine mit jedem Datum fertig wird und nicht nur mit dem recht eingeschränkten Bereich der in JavaScript darstellbaren.

function dow(y,m,d) {
  return ((ymd2julian(y,m,d) % 7) + 1) % 7;
}

Das sieht ggf. etwas abenteurlich aus: Der Tag der Woche ist einfach das julianische Datum modulo 7.

Dies liefert also Werte zwischen 0 und 6, allerdings in der Bedeutung von 0 für Montag bis 6 für Sonntag.

Die Erhöhung und erneute Restbildung bildet auf JavaScript-Verhältnisse ab. Diese Form erspart und eine Hilfsvariable und eine if-then-else-Unterscheidung.

Beispiel:

<script type="text/javascript"><!--
  var dayNames = new Array('Sonntag', 'Montag', 'Dienstag',
    'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');

  document.write('Der 9. April 1997 war ein ',
    dayNames[dow(1997,4,9)], '.');
//-->
</script>

liefert

Eine weitere Hilfsfunktion berechnet den Tag der Woche auf Basis eines Julianischen Datums. Dies dient nur dazu, dass eine ggf. redundante Berechnung dieses Julianischen Datuma entfallen kann.

function julianDow(j) {
  return ((j % 7) + 1) % 7;
}

Beispiel:

<script type="text/javascript"><!--
  var dayNames = new Array('Sonntag', 'Montag', 'Dienstag',
    'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag');

  var aJulian = ymd2julian(1997,4,9);
  document.write('Der 9. April 1997 (oder ',
    'wie die Julianer sagen: ', aJulian, ') war ein ',
    dayNames[julianDow(aJulian)], '.');
//-->
</script>

liefert

Damit haben Sie nun eine Funktion zur Berechnung des Julianischen Datums, eine allgemeine Tag des Jahres und eine allgemeine Tag der Woche Funktion.