- Offizieller Beitrag
Hier ist eine kleine Funktion zum berechnen von Sonnenaufgang und Sonnenuntergang.
Als "Nebenprodukt" enstanden dann noch Funktionen für das Schaltjahr und die Sommerzeit.
Vielleicht kann das ja noch jemand gebrauchen.
AutoIt
Global $iLat = 52.39 ; Breitengrad
Global $iLon = 9.973 ; Laengengrad
Global $iTimezone = 1 ; Zeitzone UTC = 0, MEZ = 1 (Sommerzeit wird berechnet)
Global $iYear = 2017
Global $iMonth = 4
Global $iDay = 11
ConsoleWrite('Datum: ' & StringFormat('%02d.%02d.%04d', $iDay, $iMonth, $iYear) & @CR)
ConsoleWrite('Schaltjahr: ' & (_IsLeapyear($iYear) ? 'Ja' : 'Nein') & @CR)
ConsoleWrite('Sommerzeit (MESZ): ' & _MEZ_SummertimeDate($iYear, 3) & ' - ' & _MEZ_SummertimeDate($iYear, 10) & @CR)
Global $sun = _GetSunriseAndSunset($iLat, $iLon, $iTimezone, $iYear, $iMonth, $iDay)
ConsoleWrite('Sonnenaufgang und Sonnenuntergang: ' & $sun & @CR)
; Gibt den Sonnenaufgang und den Sonnenuntergang zu den uebergebenen Daten zurueck
; Der Breitengrad sollte zwischen -65 und 65 Grad liegen! Ansonsten ist die Formel zu ungenau.
; Der Fehler dieser recht einfachen Formel liegt bei +/- 5 Minuten.
; Die Formel stammt von: "http://lexikon.astronomie.info/zeitgleichung/"
; Author: Oscar (www.autoit.de)
Func _GetSunriseAndSunset($iLat, $iLon, $iTimezone, $iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY)
Local Const $PI = 4 * ATan(1) ; PI berechnen
Local Const $RAD = $PI / 180 ; Umrechnungsformel in Radians (Bogenmass)
Local $B = $iLat * $RAD ; Breitengrad in RAD umrechnen
Local $L = $iLon ; Laengengrad !nicht! in RAD umrechnen
Local $iHours = $iTimezone + _MEZ_SummertimeHour($iYear, $iMonth, $iDay, 4, $iTimezone) ; Zeitzone und MEZ-Sommerzeit addieren
Local $T = _GetDayNumber($iYear, $iMonth, $iDay) ; Anzahl der Tage berechnen
Local $h = -50 / 60 * $RAD ; Aufgrund der Lichtbeugung der Athmosphaere wird mit einer geometrischen Horizonthoehe von -50 Bogenminuten gerechnet
Local $dk = 0.4095 * Sin(0.016906 * ($T - 80.086)) ; Deklination der Sonne (in RAD)
Local $tDiff = 12.0 * ACos((Sin($h) - Sin($B) * Sin($dk)) / (Cos($B) * Cos($dk))) / $PI ; Zeitdifferenz vom wahren Mittag bis zur Horizonthoehe (in Stunden)
Local $tEqual = -0.171 * Sin(0.0337 * $T + 0.465) - 0.1299 * Sin(0.01787 * $T - 0.168) ; Zeitgleichung (wahre Ortszeit - mittlere Ortszeit)
Local $sunrise = (12 - $tDiff - $tEqual) + -($L / 15) + $iHours ; Sonnenaufgang (in Stunden, Kommazahl)
Local $sunset = (12 + $tDiff - $tEqual) + -($L / 15) + $iHours ; Sonnenuntergang (in Stunden, Kommazahl)
$sunrise = StringFormat('%02d:%02d Uhr', Int($sunrise), Int(($sunrise - Int($sunrise)) * 60)) ; umrechnen in HH:MM
$sunset = StringFormat('%02d:%02d Uhr', Int($sunset), Int(($sunset - Int($sunset)) * 60)) ; umrechnen in HH:MM
Return $sunrise & ' - ' & $sunset
EndFunc ;==>_GetSunriseAndSunset
; Gibt die Anzahl der Tage (Tag des Jahres) zurueck
; Author: Oscar (www.autoit.de)
Func _GetDayNumber($iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY)
Local Const $aMdays[] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
Local $d = $iDay + ($iMonth >= 2 And _IsLeapyear($iYear))
For $i = 1 To $iMonth - 1
$d += $aMdays[$i - 1]
Next
Return $d
EndFunc ;==>_GetDayNumber
; Schaltjahrberechnung (true = Schaltjahr, false = kein Schaltjahr)
; Author: Oscar (www.autoit.de)
Func _IsLeapyear($iYear = @YEAR)
Return Not Mod($iYear, 4) And (Mod($iYear, 100) Or Not Mod($iYear, 400))
EndFunc ;==>_IsLeapyear
; Gibt eine 1 zurueck, wenn das uebergebene Datum/Uhrzeit in die Sommerzeit faellt
; in C++ von "jurs" aus dem deutschen Arduino Forum ("http://forum.arduino.cc/index.php?board=31.0")
; Author: Oscar (www.autoit.de)
Func _MEZ_SummertimeHour($iYear = @YEAR, $iMonth = @MON, $iDay = @MDAY, $iHour = @HOUR, $iTimezone = 1)
If $iMonth < 3 Or $iMonth > 10 Then Return 0 ; keine Sommerzeit im Jan, Feb, Nov, Dez
If $iMonth > 3 And $iMonth < 10 Then Return 1 ; Sommerzeit im Apr, Mai, Jun, Jul, Aug, Sep
Local $iBegin = 31 - Int(Mod(5 * $iYear / 4 + 4, 7)) ; Tag des Sommerzeitanfangs
Local $iEnd = 31 - Int(Mod(5 * $iYear / 4 + 1, 7)) ; Tag des Sommerzeitendes
If ($iMonth = 3 And ($iHour + 24 * $iDay) >= (1 + $iTimezone + 24 * $iBegin)) Or _
($iMonth = 10 And ($iHour + 24 * $iDay) < (1 + $iTimezone + 24 * $iEnd)) Then
Return 1
Else
Return 0
EndIf
EndFunc ;==>_MEZ_SummertimeHour
; Gibt den letzten Sonntag im Maerz (Sommerzeitanfang) oder den letzten Sonntag im Oktober (Sommerzeitende) zurueck
; Author: Oscar (www.autoit.de)
Func _MEZ_SummertimeDate($iYear = @YEAR, $iMonth = 3)
Local $iDay = 0
Switch $iMonth
Case 3 ; wenn der Maerz als Monat uebergeben wurde
$iDay = 31 - Int(Mod(5 * $iYear / 4 + 4, 7)) ; Tag des Sommerzeitanfangs
Case 10 ; wenn der Oktober als Monat uebergeben wurde
$iDay = 31 - Int(Mod(5 * $iYear / 4 + 1, 7)) ; Tag des Sommerzeitendes
Case Else
Return SetError(1, 0, 'error')
EndSwitch
Return StringFormat('%02d.%02d.%04d', $iDay, $iMonth, $iYear)
EndFunc ;==>_MEZ_SummertimeDate
Alles anzeigen
Die Ausgabe sieht dann so aus: