Berechnung des Sonnenaufgangs mit Perl, basierend auf http://lexikon.astronomie.info/zeitgleichung/
Jetzt würde ich nur noch gerne wissen, wie ich möglichst einfach bestimmen kann, ob a dem Tag Sommer- oder Winterzeit gilt.
#!/usr/bin/perl -w
#---------------------------------------
#
# Filename: sonne.pl
# Description: Berechnung von Sonnenauf- und Untergang.
# Date: 05/24/08
#---------------------------------------
use strict;
use Math::Trig 'acos';
my $day = 150;
my $zeitzone = 1;
# kontrolle:
# http://lexikon.astronomie.info/zeitgleichung/sunscript.html
# berlin
my $breite = 52.5;
my $laenge = 13.5;
my ($a, $u) = &risingSun($breite, $laenge, $day);
print "Aufgang: ". &toMinute($a) . "\t" . $a ."\n";
print "Untergang: ". &toMinute($u) . "\t" . $u ."\n";
###################################################
# Berechnet Zeitpunkt des Sonnenauf- und untergangs fuer einen
# bestimmten Tag des Jahres.
# Die Berechnung basiert auf http://lexikon.astronomie.info/zeitgleichung/
# Parameter:
# breite: geographische Breite in Bogenmaß
# laenge: geographische Länge in Grad
# day: Tag des Jahres.
#
# returns:
# (aufgang, untergang) als dezimalwert.
# fuer den Referenzbreitengrad 15°E. (MEZ)
sub risingSun {
###################################################
my $breite = shift;
my $laenge = shift;
my $day = shift;
my $PI = 3.1415926536;
my $RAD = $PI/180.0;
my $B = $breite * $RAD;
my $zeitgleichung = -0.171 * sin(0.0337 * $day + 0.465) - 0.1299 * sin(0.01787 * $day - 0.168);
my $deklination = 0.4095 * sin(0.016906 * ($day - 80.086));
# daemmerung, wenn sonne 50 bogenminuten unterhalb des horizonts
my $h = -0.0145;
my $tmp = (sin($h) - (sin($B) * sin($deklination))) / (cos($B) * cos($deklination));
if (abs($tmp) > 1) {
# Mitternachtssonne o.ae.
warn("Sonne erreicht nie die geforderte Hoehe $h");
return -1;
}
my $zeitdifferenz = 12 * acos( $tmp )/ $PI;
# Mittlere Ortszeit:
my $a_ort = 12 - $zeitdifferenz - $zeitgleichung;
my $u_ort = 12 + $zeitdifferenz - $zeitgleichung;
# 15. Breitengrad fuer MEZ.
my $a = $a_ort + (15 - $laenge ) * 4/60 + $zeitzone;
my $u = $u_ort + (15 - $laenge ) * 4/60 + $zeitzone;
return ($a, $u);
}
###################################################
# wandelt einen dezimalwert in eine Zeitangabe der
# Form HH:MM:SS
sub toMinute {
###################################################
my $time = shift;
my $stunde = int($time);
my $minuten = ($time - int($time)) * 60;
my $sekunden = int(($minuten - int($minuten)) * 60);
$minuten = int($minuten);
return sprintf("%2d:%02d:%02d", $stunde, $minuten, $sekunden);
}
update: erst jetzt fällt mir auf, dass es auch Perl Modul dafür gibt.
Veröffentlicht in perl
Schlagwörter: perl, sonnenaufgang, sunrise