﻿#include <Array.au3>
#include <Date.au3>

; Beispiel fuer die Rueckgabe der Jahreszeit zu einem Datum
Global $sDate = '2017/04/03 00:00:00'
MsgBox(0, 'Jahreszeit', 'Gesuchtes Datum: ' & @CRLF & $sDate & ' -> ' & _GetSeason(1, $sDate))


; Beispiel fuer die Auflistung wann die Jahreszeiten in einem Jahr beginnen
Global Const $sEPOCH = '1970/01/01 00:00:00'
Global $sDate = '2017/12/31 00:00:00' ; <- Startdatum muss der 31. Dezember des gesuchten Jahres sein
Global $aSeasonDate[4][2]

For $i = 3 To 0 Step -1
	$aSeasonDate[$i][0] = _GetSeason(1, $sDate) ; die Funktion gibt den Jahreszeitnamen zurueck
	$sDate = _DateAdd('s', @extended, $sEPOCH) ; @extended enthält den Anfang der Jahreszeit (in Unixzeit)
	$aSeasonDate[$i][1] = $sDate
Next
_ArrayDisplay($aSeasonDate, 'Jahreszeiten ' & StringLeft($sDate, 4) + 1, '', 16 + 64, '|', 'Jahreszeit|Anfang')


;===============================================================================
; Function Name:   _GetSeason([$iLanguage][, $sDate])
; Description:     Gibt die Jahreszeit zurueck von einem uebergebenen Datum (nur fuer die Jahre zwischen 2000 und 3000 moeglich)
; Parameter(s):    $iLanguage = 0 (Englisch) oder 1 (Deutsch)
;                  $sDate = Datum und Uhrzeit im Format: 'YYYY/MM/DD[ hh:mm:ss]'
; Requirement(s):  ---
; Return Value(s): den Namen der Jahreszeit und als @extended den Anfang der Jahreszeit (in Unixzeit)
; Author(s):       Oscar (www.autoit.de)
;===============================================================================
Func _GetSeason($iLanguage = 0, $sDate = _NowCalc())
	If Not _DateIsValid($sDate) Then Return SetError(1, 0, 'error')
	Local Const $aSEASONNAMES[2][4] = [ _ ; die Jahreszeiten-Namen in Englisch (0) und Deutsch (1)
			['Spring', 'Summer', 'Autumn', 'Winter'], _
			['Frühling', 'Sommer', 'Herbst', 'Winter']]
	If $iLanguage < 0 Or $iLanguage >= UBound($aSEASONNAMES) Then $iLanguage = 0
	If StringLeft($sDate, 4) < 2000 Or StringLeft($sDate, 4) > 3000 Then Return SetError(2, 0, 'error') ; die Sekunden pro Jahreszeit gelten nur fuer die Jahre zwischen 2000 und 3000
	Local Const $aSEASONTICKS[4] = [8014464, 8091360, 7762176, 7688736] ; Sekunden pro Jahreszeit (Fruehling, Sommer, Herbst, Winter)
	Local Const $sEPOCH = '1970/01/01 00:00:00'
	Local $iStart = _DateDiff('s', $sEPOCH, '2000/03/20 08:35:00') ; Unixzeit vom Fruehlingsanfang im Jahr 2000 -> '2000/03/20 08:35:00'
	Local $iSeasonCount = 0 ; Fruehlingsanfang als Start-Jahreszeit
	Local $iDate = _DateDiff('s', $sEPOCH, $sDate) ; Unixzeit vom gesuchten Datum
	If $iDate < $iStart Then Return SetError(3, 0, 'error') ; kein Datum vor Fruehlingsanfang 2000 erlaubt
	While $iStart + $aSEASONTICKS[$iSeasonCount] < $iDate ; die Schleife solange durchlaufen bis das gesuchte Datum erreicht ist
		$iStart += $aSEASONTICKS[$iSeasonCount] ; zu der Start-Unixzeit die Sekunden der Jahreszeit addieren
		$iSeasonCount += 1 ; die naechste Jahreszeit
		If $iSeasonCount > 3 Then $iSeasonCount = 0 ; wenn der Winter addiert wurde, dann wieder mit Fruehling fortfahren
	WEnd
	Return SetError(0, $iStart, $aSEASONNAMES[$iLanguage][$iSeasonCount]) ; Jahreszeit zurueckgeben
EndFunc   ;==>_GetSeason
