Berechnungen zu Datum und Zeit


1.1 Schaltjahr

Ein astronomisches oder tropisches Jahr ist die Zeit, die die Erde für einen Umlauf um die Sonne benötigt, d.h. es ist der Zeitraum von einer Frühlingsanfang zur nächsten.

Astronomisches Jahr = 365.242198781 Tage

Schon die alten ägypter bestimmten etwa 4.000 vor Christus diese Jahreslänge auf 365 Tage. Doch das tropische Jahr, also der exakte Umlauf um die Sonne von einem Frühlingspunkt zum nächsten dauert etwa 365,2422 Tage, d.h. etwa 365 Tage und ca. 6 Stunden und somit verschiebt sich der kalendarische Frühlingsanfang alle vier Jahre um etwa einen Tag.

Dies nahm Julius Cäsar im Jahr 46 v. Christus zum Anlass den Kalender zu reformieren und alle vier Jahre ein Schaltjahr einzufügen, das am Ende des Jahres einen zusätzlichen Tag erhält. Da das Jahr mit dem März begann, bekam der Februar im Schaltjahr einen zusätzlichen Tag, den Schalttag.

Diese Korrektur alle vier Jahre ist auf ca. 45 Minuten genau: 4 * 0,25 - 4 * 0,2422, d.h. pro Jahr gibt es eine Abweichung von ca. 11. Minuten. Diese 11 Minuten hatten sich im Jahre 1582 bereits auf 10 Tage aufsummiert, so dass sich Papst Gregor XIII zur gregorianischen Kalenderreform entschied und mit dieser eine weitere Korrektur im Kalender einführte.
Ein Schaltjahr ist seit dem ein Jahr das ohne Rest durch vier teilbar ist, es sei denn es ist auch durch 100, aber nicht durch 400 ohne Rest teilbar, d.h. das Jahr 2000 war ein Schaltjahr, 2100 wird jedoch kein Schaltjahr sein.

Mit dieser Korrektur beträgt die Differenz zum tropischen Jahr nur noch 11 Sekunden pro Jahr: 400 * 365 + 100 - 3 = 146.097 Tage / 100 = 365.2425 Tage.
PHP Code
/***********************************************************************
 * IsLeapYear ermittelt, ob ein Jahr ein Schaltjahr ist
 * Parameter: Jahr als Integerwert
 * Rueckgabe: Boolean, true falls es sich um ein Schaltjahr handelt
 **********************************************************************/
function IsLeapYear(int $year){
	if(($year % 4 == 0 && $year % 100 != 0) || ($year % 100 == 0 && $year % 400 != 0)){
		return true;
	}
	else{
		return false;
	}
}
Python Code
def IsLeapYear(year):
  if((year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 and year % 400 == 0)):
    return True
  else:
    return False

		
Mit einer kleinen Modifikation lässt sich auch der Schalttag aus diesen Funktionen ermitteln.
PHP Code
/***********************************************************************
 * GetLeapDay ermittelt die Anzahl der Schalttage (0 oder 1)
 * Parameter: Jahr als Integerwert
 * Rückgabe: Int, 1 falls es sich um ein Schaltjahr handelt
 **********************************************************************/
function GetLeapDay(int $year){
	if(($year % 4 == 0 && $year % 100 != 0) || ($year % 100 == 0 && $year % 400 != 0)){
		return 1;
	}
	else{
		return 0;
	}
}
Python Code
def GetLeapDay(year):
  if((year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 and year % 400 == 0)):
    return 1
  else:
    return 0

1.2 Monatslänge

Erläuterung

Die ursprüngliche Dauer eines Monats betrug 29 Tage, d.h. die Monatslänge orientierte sich am Umlauf des Monds, dem synodischen Monat, und Julius Cäsar führte 46 v. Christus mit seiner Kalenderreform ein, dass die Monate wechselnde Längen von 28 bis 31 Tagen bekommen, damit die Summe der Tage pro Jahr 365 bzw. 366 ergibt, was wiederum der tatsächlichen Länge des Jahres entsprach.

Aus dieser Festlegung gilt:

Monat Länge Monat Länge
Januar 31 Juli 31
Februar 28 oder 29 August 31
März 31 September 30
April 30 Oktober 31
Mai 31 November 30
Juni 30 Dezember 31


Bedeutung in der Astronomie

Bei der Umrechnung von Datums- und Zeitangaben, z.B. die Umrechnung von lokaler Zeit in Universalzeit (d.h. Greenwich Zeit), unter Berücksichtung der Zeitzonen und der Sommerzeit kann es vorkommen, dass sich das Datum um einen Tag vor oder zurück verschiebt. Hier ist es dann ggf. wichtig zu wissen, welches der letzte Tag im Monat ist, um das richtige Tagesdatum des umgerechneten Wertes zu bestimmen.
Außerdem ist die fortlaufende Tagesnummer, die in einigen Berechnungen benötigt wird, ist von der Monatslänge und insbesondere dem Schalttag abhängig.
PHP Code
/***********************************************************************
 * 
 **********************************************************************/
function GetMonthLen($month, $year){
	if($month == 2){
		return 28 + GetLeapDay($year);
		
	}
	else{
		if($month == 1 || $month == 3 || $month == 5 || $month == 7 || 
		   $month == 8 || $month == 10 || $month == 12){
			return 31;
		}
		else{
			return 30;
		}
	}
}
Python Code
#Berechnung der Monatslaenge
def GetMonthLen(month, year):
    if(month == 2):
        return 28 + GetLeapDay(year)
    elif(month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or 
         month == 10 or month == 12):
        return 31
    else:
        return 30

1.3 Tagesnummer

Erläuterung

Tage im Jahr können durchnummeriert und somit ein Datum in eine Tagesnummer umgerechnet werden. Nimmt man noch die Uhrzeit als Dezimalanteil eines Tages hinzu, kann mit einem Dezimalwert der genaue Zeitpunkt innerhalb eines Jahres definiert werden.
Als Ausgangspunkt wird hierbei Mitternacht am 0. Januar (d.h. Mitternacht zwischen 30. und 31.12.) verwendet und man ermittelt die Anzahl Tage, die seit diesem Ausgangspunkt vergangen sind. Somit kann z.B. der Mittag (12:00 Uhr) des 3. Januar als 3.5 dargestellt werden und 6:00 morgens am 1. Januar als 1.25.

Bedeutung in der Astronomie

In vielen astronomischen Berechnungen setzt man ein bestimmtes Datum oder Ereignis, z.B. ein Datum eines Vollmonds, als Ausgangspunkt für weitere Berechnungen. Mit der Tagesnummer kann man die Anzahl der vergangenen Tage und somit z.B. auch Zyklen, wie den synodischen Monat berechnen.
PHP Code
/***********************************************************************
 * 
 **********************************************************************/
function GetDayNumber(int $timestamp){
	$year = date("Y", $timestamp);
	$month = date("m", $timestamp);
	$day = date("d", $timestamp);
	$hour = date("h", $timestamp);
	$minute = date("G", $timestamp);
	$second = date("s", $timestamp);
	
	$decimalday = ($hour / 24) + ($minute / 1440) + ($second / 86400);
	$s = 63 - IsLeapYear($year);
	
	$result = 0;
	
	if($month > 2){
		$month = $month + 1;
		$result = floor($month * 30.6) - $s + $day;
	}
	else{
		$month = $month - 1;
		$result = floor(($month * $s) / 2) + $day;
	}
	
	$result = $result + $decimalday;
	
	return $result;
}

1.4 Julianisches Datum

Erläuterung

Das Julianische Datum gibt an, wie viele Tage seit dem 01.01.4713 v. Chr. um 12 Uhr Weltzeit vergangen sind.

Bedeutung in der Astronomie

Mit dem Julianischen Datum ist es möglich die Zeitdifferenz zwischen zwei Tagen auf die Sekunde genau als Dezimalwert darzustellen und damit hat man wiederum die Möglichkeit, die Konstellationen (basierend auf Zyklen) für ein bestimmtes Datum zu berechnen.
PHP Code
/***********************************************************************
 * GetJulianDate das julianisches Datum als float-Wert zurück
 * Parameter: Unix-Zeitstempel für das umzurechnende DatumJahr als Integerwert,
 * Boolean, wenn die Uhrzeit mit berechnet werden soll
 * Rueckgabe:		float
 **********************************************************************/
function GetJulianDate($timestamp, $fulldate){
	$year = date("Y", $timestamp);
	$month = date("m", $timestamp);
	$day = date("d", $timestamp);
	if($fulldate){
		$hour = date("G", $timestamp);
		$minute = date("i", $timestamp);
		$second = date("s", $timestamp);
	}
	else{
		$hour = 0;
		$minute = 0;
		$second = 0;
	}
	
	$gregorian = mktime(0,0,0,10,15,1582);
	// Datum >= 15.10.1582
	if($timestamp >= $gregorian){
		$a = floor($year / 100);
		$b = 2 - $a + floor($a / 4);
	};

	if($month <= 2){
		$year  = $year - 1;
		$month = $month + 2;
	}
	
	$h = ($hour / 24) + ($minute / 1440) + ($second / 86400);
	
	$jd = floor(365.25*($year+4716)) + floor(30.6001*($month+1)) + $day + $h + $b - 1524.5;

	// mit einem Runden auf 5 Nachkommastellen hat man eine Genauigkeit im Sekundenbereich
	return round($jd, 5);
}
		
Berechnungen