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