Berechnung von Jahreszeiten

Ich bin bis vor einigen Tagen davon ausgegangen das der Jahreszeiten-Wechsel zu statischen, fixen Zeitpunkten im Jahr stattfindet.

Das ist aber falsch!

Da ich immer mal wieder an meiner internationalen PHP Feiertags-Library Niirrty\Holiday arbeite und gerade das Feature der nicht arbeitsfreien Feiertage einbaue bin ich notgezwungener Massen über Frühlings- Sommer-, Herbst- und Winter-Start gestolpert und muste feststellen das es wohl garnicht so einfach ist hier die realen Zeitpunkte zu ermitteln.

Verschiedene Quellen im Netz haben mich dann auf die richtige Spur gebracht.

Berechnungsgrundlagen

Die Zeitspanne

Jeder Anfang einer Jahreszeit verschiebt sich im Vergleich zum Vorjahr um eine spezifische Zeitspanne.

 

Nord Süd Tage Stunden Minuten Sekunden Gesamt in Tagen Gesamt in Sekunden
Frühling Herbst 365 5 49 2 365,24238 31556942
Sommer Winter 365 5 47 57 365,24164 31556877
Herbst Frühling 365 5 48 31 365,24203 31556911
Winter Sommer 365 5 49 33 365,24275 31556973

Das alleine ist aber wenig hilfreich, da hier noch vollkommen der Bezug fehlt.

Das Referenzdatum

Für verschiedene näher liegende Zeiträume werden dazu die folgenden Zeitpunkte als Referenzdatum empfohlen, von dem aus die Berechnungen für den angegebenen Jahres-Zeitraum stattfinden sollten.

Nord Süd Referenzdatum
1700-1900
Frühling Herbst 21.03.1805 00:57:30 UTC
Sommer Winter 21.06.1805 21:42:30 UTC
Herbst Frühling 23.09.1805 11:22:30 UTC
Winter Sommer 21.12.1805 05:06:30 UTC
1900-2100
Frühling Herbst 20.03.2005 11:33:19 UTC
Sommer Winter 21.06.2005 06:39:11 UTC
Herbst Frühling 22.09.2005 22:16:34 UTC
Winter Sommer 21.12.2005 18:34:51 UTC

Weitere Daten können z.B. hier entnommen werden.

Beispiel in PHP

Es soll der Sommeranfang (Sommer-Sonnenwende) für das Jahr 2018 berechnet werden

Referenzdatum ist dafür aus der obigen Liste 2005-06-21 06:39:11 UTC

von 2005 bis 2018 sind 13 Jahre Unterschied

Das bedeutet es müssen 13 x 365 Tage 5h 47m 57s oder 13 x 31556877 Sekunden hinzugefügt werden.

<?php

// Jahr für das berechnet werden soll
$yearRequired   = 2018;

// Referenzdatum für Sommeranfang in der nördl. Hemisphäre initialisieren
$refDate        = new \DateTime( '2005-06-21 06:39:11 UTC' );

// Differenz in Jahren berechnen. Kann positiv oder negativ sein!
$yearDifference = $yearRequired - (int) $refDate->format( 'Y' );

// Interval festlegen
$interval = new \DateInterval( 'PT' . ( $yearDifference * 31556877 ) . 'S' );

// Intervall hinzufügen (positive Sekunden) ober abziehen (negative Sekunden)
if ( $yearDifference > 0 )
{
   $refDate->add( $interval );
}
else if ( $yearDifference < 0 )
{
   $refDate->sub( $interval );
}

// Berechnetes Datum ausgeben
echo $refDate->format( 'Y-m-d H:i' );

 

 

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.