- Offizieller Beitrag
Hallo,
das hier waren meine ersten Gehversuche mit AutoIt. Ermittlung eines beliebigen Wochentages mit der Formel von Christian Zeller und Berechnung (fast) aller Feiertage (fix und variabel) Deutschlands.
Ich bin absolut begeistert von den Möglichkeiten, die diese Scriptsprache bietet. Das folgende Prog hab ich vergleichsweise auch mal in VB geschrieben. Die fertige EXE mit allen notwendigen Bibliotheken bringt es auf runde 5 MB! Das gleiche Ergebnis mit AutoIt ca. 130 kB!! - Und keine Installation notwendig.
Edit 13.12.2009:
Ich habe die Funktion _Feiertage() (aus Post #4) erweitert um den Gültigkeitsbereich. Bundeseinheitliche Gesetzliche Feiertage sind mit BG markiert, regional unterschiedliche gesetzliche Feiertage mit den ISO-Kürzeln der jeweiligen Bundesländer (BB, BE, BY...).
Die Daten können jetzt wahlweise gegliedert nach fixen und variablen Feiertagen (innerhalb sortiert) oder alle Feiertage gemeinsam sortiert ausgegeben werden.
Edit 18.04.2009:
Fehler bei falscher Datumswahl (31.06. etc.) gefixt
Edit 17.04.2009:
Nach langer Zeit habe ich mich mal rangesetzt und dieses Erstlingswerk von mir mal auf einen aktuellen Stand gebracht, sowohl von der AutoIt-Version her, als auch programmiertechnisch (schön geschrumpft).
Edit 17.12.2012:
Da es thematisch hierher passt, folgende Funktion zusätzlich: _DateToNameWeekDayGER( )
Es wird der deutsche Wochentagsname in Lang- oder Kurzform für ein bestimmtes Datum zurückgegeben.
_DateToNameWeekDayGER
#include <Date.au3>
;===============================================================================
; Function Name....: _DateToNameWeekDayGER
; Description......: Gibt den Namen des Wochentags (lang od. kurz) für ein übergebenes Datum zurück
; Parameter(s).....: $_sDate Datumstring in der Form "JJJJ/MM/TT"; "-1" (Standard) für Heute
; .................: $_iShort "0" (Standard) gibt den Langnamen, "1" den Kurznamen zurück
; Requirement(s)...: #include <Date.au3>
; Return Value(s)..: Erfolg Rückgabe deutscher Wochentagsname (Lang- od. Kurzform)
; .................: Fehler Leerstring u. @error = 1 Datumstring enthält ungültiges Datum
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _DateToNameWeekDayGER($_sDate=-1, $_iShort=0)
If $_sDate = -1 Then $_sDate = @YEAR & '/' & @MON & '/' & @MDAY
If Not _DateIsValid($_sDate) Then Return SetError(1,0,'')
Local $aWDay[8][2] = [[7],['Montag','Mo'],['Dienstag','Di'],['Mittwoch','Mi'],['Donnerstag','Do'],['Freitag','Fr'],['Sonnabend','Sa'],['Sonntag','So']]
Local $aSplit = StringSplit($_sDate, '/')
Return $aWDay[_DateToDayOfWeekISO($aSplit[1], $aSplit[2], $aSplit[3])][$_iShort]
EndFunc ;==>_DateToNameWeekDayGER
Und hier nun das Ergebnis:
Spoiler anzeigen
; ----------------------------------------------------------------------------
; AutoIt Version: 3.3.0.0
;
;Osterformel (Gauss)
; a = Jahr mod 19
; b = Jahr mod 4
; c = Jahr mod 7
; H1 = Jahr div 100
; H2 = Jahr div 400
; N = 4 + H1 - H2
; M = 15 + H1 - H2 - [(8 * H1 + 13) div 25]
; d = (19 * a + M) mod 30
; e = (2 * b + 4 * c + 6 * d + N) mod 7
;wenn d + e = 35, dann ostern = 50
;wenn d = 28 und e = 6 und a > 10, dann ostern = 49
;in allen anderen Fällen: ostern = 22 + d + e
;ostern: Ostersonntag als Märzdatum
; ----------------------------------------------------------------------------
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <Date.au3>
#include <Array.au3>
Opt("GUIOnEventMode", 1)
Global $aRadioT[31], $aRadioM[12], $aHDays, $aLabel[32][2], $x, $y
#region - GUI-Definition
$gui = GUICreate("Wochen- und Feiertagsbestimmung", 680, 485, -1, -1)
GUISetBkColor(0xFFFACD)
GUISetOnEvent($GUI_EVENT_CLOSE, 'Ende')
$Label_1 = GUICtrlCreateLabel("Bestimmen Sie den Wochentag ! (gültig: 1583 - 8201)", 200, 10, 280, 20)
GUICtrlSetColor($Label_1, 0xFF0000)
$aktDatum = GUICtrlCreateLabel(@MDAY & "." & @MON & "." & @YEAR, 620, 10, 60, 20)
;Gruppe Optionsfelder zur Datumsauswahl
$Group_T = GUICtrlCreateGroup(" Tag ", 15, 25, 650, 60)
$x = 20
For $i = 1 To 31
$R_Name = $i
If $i < 16 Then
If $i < 10 Then $R_Name = "0" & $i
$aRadioT[$i-1] = GUICtrlCreateRadio($R_Name, $x, 45, 30, 15)
If $i = 15 Then
$x = 20
Else
$x += 40
EndIf
Else
$aRadioT[$i-1] = GUICtrlCreateRadio($R_Name, $x, 60, 30, 15)
$x += 40
EndIf
If $i = @MDAY Then GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetOnEvent(-1, "_RunData")
Next
GUICtrlCreateGroup ("",-99,-99,1,1)
$Group_M = GUICtrlCreateGroup(" Monat ", 15, 100, 255, 60)
$x = 20
For $i = 1 To 12
$R_Name = $i
If $i < 10 Then $R_Name = "0" & $i
If $i < 7 Then
$aRadioM[$i-1] = GUICtrlCreateRadio($R_Name, $x, 120, 30, 15)
$x += 40
Else
If $i = 7 Then $x = 20
$aRadioM[$i-1] = GUICtrlCreateRadio($R_Name, $x, 135, 30, 15)
$x += 40
EndIf
If $i = @MON Then GUICtrlSetState(-1, $GUI_CHECKED)
GUICtrlSetOnEvent(-1, "_RunData")
Next
GUICtrlCreateGroup ("",-99,-99,1,1)
$MsgTag = GUICtrlCreateLabel("", 340, 100, 200, 20)
GUICtrlSetColor(-1, 0xFF0000)
$Label_4 = GUICtrlCreateLabel("Jahr", 340, 122, 40, 20)
$But_minus = GUICtrlCreateButton("-", 406, 123, 15, 15)
GUICtrlSetOnEvent(-1, "Minus")
$But_plus = GUICtrlCreateButton("+", 468, 123, 15, 15)
GUICtrlSetOnEvent(-1, "Plus")
$InYear = GUICtrlCreateInput(@YEAR, 425, 120, 40, 20, $SS_CENTER)
GUICtrlSetOnEvent(-1, "_RunData")
$Ende = GUICtrlCreateButton("Ende", 615, 105, 50, 20)
GUICtrlSetOnEvent(-1, "Ende")
$Schalt = GUICtrlCreateLabel("", 500, 122, 80, 20)
GUICtrlSetColor(-1, 0x0000FF)
$Label_9 = GUICtrlCreateLabel("Wochentag:", 340, 145, 90, 20)
$WTag = GUICtrlCreateLabel("", 425, 145, 90, 20)
GUICtrlSetColor(-1, 0x0000FF)
$L_Feiertage = GUICtrlCreateLabel("Die Feiertage dieses Jahres", 265, 175, 150, 20)
GUICtrlSetColor(-1, 0xFF0000)
$L_Fix = GUICtrlCreateLabel("Unveränderlich:", 70, 200, 90, 20)
GUICtrlSetColor(-1, 0xFF0000)
$L_Variabel = GUICtrlCreateLabel("Veränderlich (gültig: 1583 - 2999):", 380, 200, 170, 20)
GUICtrlSetColor(-1, 0xFF0000)
; Fixe Feiertage:
$y = 220
For $i = 0 to 10
$aLabel[$i][0] = GUICtrlCreateLabel('', 80, $y, 180, 17)
$aLabel[$i][1] = GUICtrlCreateLabel('date', 280, $y, 100, 17)
GUICtrlSetColor(-1, 0x0000FF)
$y += 15
Next
; Adventstage
GUICtrlCreateLabel("Adventstage:", 185, 420, 80, 20)
GUICtrlSetColor(-1, 0xFF0000)
$x = 80
For $i = 28 To 31
$aLabel[$i][0] = GUICtrlCreateLabel('', $x, 440, 60, 34)
GUICtrlSetColor(-1, 0x0000FF)
$x += 70
Next
; Variable Feiertage:
$y = 220
For $i = 11 to 27
$aLabel[$i][0] = GUICtrlCreateLabel('', 390, $y, 180, 17)
$aLabel[$i][1] = GUICtrlCreateLabel('', 570, $y, 70, 17)
GUICtrlSetColor(-1, 0x0000FF)
$y += 15
Next
_RunData()
GUISetState()
#endregion - GUI-Definition
While 1
Sleep(100)
WEnd
#region - Funktionen
Func Ende()
Exit
EndFunc
Func Minus()
GUICtrlSetData($InYear, GUICtrlRead($InYear) - 1)
_RunData()
EndFunc
Func Plus()
GUICtrlSetData($InYear, GUICtrlRead($InYear) + 1)
_RunData()
EndFunc
Func _RunData()
$aHDays = _Feiertage(GUICtrlRead($InYear))
If _DateIsLeapYear(GUICtrlRead($InYear)) Then
GUICtrlSetData($Schalt, 'Schaltjahr')
Else
GUICtrlSetData($Schalt, '')
EndIf
For $i = 0 to 31
GUICtrlSetData($aLabel[$i][0], $aHDays[$i][0] & ' ' & $aHDays[$i][1])
If $i > 27 Then ContinueLoop
GUICtrlSetData($aLabel[$i][1], _
_GetDateStr(_DateToDayOfWeek(StringRight($aHDays[$i][0],4), StringMid($aHDays[$i][0],4,2), StringLeft($aHDays[$i][0],2))))
Next
_WTag()
EndFunc ;==> _RunData
Func _WTag()
Local $day, $mon
GUICtrlSetData($MsgTag, '')
For $i = 0 To 30
If BitAND(GUICtrlRead($aRadioT[$i]), $GUI_CHECKED) Then
$day = ControlGetText($gui, '', $aRadioT[$i])
ExitLoop
EndIf
Next
For $i = 0 To 11
If BitAND(GUICtrlRead($aRadioM[$i]), $GUI_CHECKED) Then
$mon = ControlGetText($gui, '', $aRadioM[$i])
ExitLoop
EndIf
Next
If _DateIsLeapYear(GUICtrlRead($InYear)) Then
If $mon = 2 and $day > 29 Then
$day = 29
GUICtrlSetState($aRadioT[28],$gui_checked)
GUICtrlSetData($MsgTag,"'Tag' für Berechnung auf "& $day & " korrigiert!")
EndIf
Else
If $mon = 2 and $day > 28 Then
$day = 28
GUICtrlSetState($aRadioT[27],$gui_checked)
GUICtrlSetData($MsgTag,"'Tag' für Berechnung auf "& $day & " korrigiert!")
EndIf
EndIf
If ($mon = 4 Or $mon = 6 Or $mon = 9 Or $mon = 11 ) And $day > 30 Then
$day = 30
GUICtrlSetData($MsgTag,"'Tag' für Berechnung auf "& $day & " korrigiert!")
GUICtrlSetState($aRadioT[29],$gui_checked)
EndIf
GUICtrlSetData($WTag, _GetDateStr(_DateToDayOfWeek(GUICtrlRead($InYear), $mon, $day)))
EndFunc ;==>_WTag
Func _GetDateStr($num)
Switch $num
Case 1
Return "Sonntag"
Case 2
Return "Montag"
Case 3
Return "Dienstag"
Case 4
Return "Mittwoch"
Case 5
Return "Donnerstag"
Case 6
Return "Freitag"
Case 7
Return "Samstag"
EndSwitch
EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Funktion _Feiertage($Jahr)
;
; gibt die Feiertage des übergebenen Jahres
; als sortiertes Array[TT.MM.JJJJ od. JJJJ/MM/TT][Feiertag] zurück (gegliedert fix/variabel)
; $DateTyp 1 - Datum als TT.MM.JJJJ (Standard)
; 0 - Datum als JJJJ/MM/TT
; Autor BugFix ([email='bug_fix@web.de'][/email])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _Feiertage($year, $DateTyp=1)
Local $4AdvDat, $3AdvDat, $2AdvDat, $1AdvDat, $TotSoDat, $BuBDat, $MutterDat, $ErnteDat, $tmp
Local $HDays[32][2], $a, $b, $c, $d, $e, $H1, $H2, $N, $M
;fixe Feiertage
$HDays[0][0] = $year & "/01/01\Neujahr"
$HDays[1][0] = $year & "/01/06\Heilige Drei Könige"
$HDays[2][0] = $year & "/02/14\Valentinstag"
$HDays[3][0] = $year & "/05/01\Maifeiertag"
$HDays[4][0] = $year & "/10/03\Tag der Deutschen Einheit"
$HDays[5][0] = $year & "/10/31\Reformationstag"
$HDays[6][0] = $year & "/11/01\Allerheiligen"
$HDays[7][0] = $year & "/12/24\Heiligabend"
$HDays[8][0] = $year & "/12/25\1. Weihnachtsfeiertag"
$HDays[9][0] = $year & "/12/26\2. Weihnachtsfeiertag"
$HDays[10][0] = $year & "/12/31\Silvester"
;variable Feiertage
$a = Mod($year, 19)
$b = Mod($year, 4)
$c = Mod($year, 7)
$H1 = Int($year / 100)
$H2 = Int($year / 400)
$N = 4 + $H1 - $H2
$M = 15 + $H1 - $H2 - Floor (Int((8 * $H1 + 13) / 25))
$d = Mod((19 * $a + $M), 30)
$e = Mod((2 * $b + 4 * $c + 6 * $d + $N), 7)
If $d + $e = 35 Then
$Easter = 50
Else
If $d = 28 And $e = 6 And $a > 10 Then
$Easter = 49
Else
$Easter = 22 + $d + $e
EndIf
EndIf
If $Easter < 32 Then
$EasterDay = $Easter
$EasterMonth = "03"
Else
$EasterDay = $Easter - 31
$EasterMonth = "04"
EndIf
If $EasterDay < 10 Then
$EasterDay = "0" & $EasterDay
EndIf
If $year < 1900 Then ; Datumsoperationen nur mgl. wenn > 1900 , Jahr wird konvertiert
$RestJahr = Mod($year, 100)
If _DateIsLeapYear($year) Then
If $RestJahr < 10 Then
$RestJahr = "0" & $RestJahr
EndIf
$Tempyear = 20 & $RestJahr
Else
If $RestJahr < 10 Then
$RestJahr = "0" & $RestJahr
EndIf
$Tempyear = 19 & $RestJahr
EndIf
$EasterDate = $Tempyear & "/" & $EasterMonth & "/" & $EasterDay
Else
$EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay
EndIf
$WFastDate = _DateAdd( 'd', -52, $EasterDate)
$RosDat = _DateAdd( 'd', -48, $EasterDate)
$FastDat = _DateAdd( 'd', -47, $EasterDate)
$AschDat = _DateAdd( 'd', -46, $EasterDate)
$GrDoDat = _DateAdd( 'd', -3, $EasterDate)
$KarDat = _DateAdd( 'd', -2, $EasterDate)
$OSaDat = _DateAdd( 'd', -1, $EasterDate)
$OSoDat = $EasterDate
$OMoDat = _DateAdd( 'd', 1, $EasterDate)
$HiFaDat = _DateAdd( 'd', 39, $EasterDate)
$PfSoDat = _DateAdd( 'd', 49, $EasterDate)
$PfMoDat = _DateAdd( 'd', 50, $EasterDate)
$FroDat = _DateAdd( 'd', 60, $EasterDate)
; Ermitteln nicht von Ostern abhängiger, veränderlicher Feiertage
; Muttertag = 2. Sonntag im Mai ABER wenn Pfingsten = 2.Sonntag im Mai dann ist Muttertag am 1. Sonntag
; Der 2. Sonntag kann nur zw. dem 8. u. 14.5. liegen
For $maitag = 8 To 14
If _DateToDayOfWeek($year, 5, $maitag) = 1 Then
If $maitag < 10 Then
$maitag = "0" & $maitag
EndIf
$MutterDat = $year & "/05/" & $maitag
If $MutterDat = $PfSoDat Then
$MutterDat = _DateAdd( 'd', -7, $year & "/05/" & $maitag)
EndIf
ExitLoop
EndIf
Next
; Erntedankfest 1. Sonntag im Oktober (zw. 1. u. 7.10.)
For $oktobertag = 1 To 7
If _DateToDayOfWeek($year, 10, $oktobertag) = 1 Then
$oktobertag = "0" & $oktobertag
$ErnteDat = $year & "/10/" & $oktobertag
ExitLoop
EndIf
Next
; 4.Advent = Sonntag vor 25.12. (zw. 18. u. 24.12.)
For $deztag = 18 To 24
If _DateToDayOfWeek($year, 12, $deztag) = 1 Then
$4AdvDat = $year & "/12/" & $deztag
$3AdvDat = _DateAdd( 'd', -7, $4AdvDat)
$2AdvDat = _DateAdd( 'd', -14, $4AdvDat)
$1AdvDat = _DateAdd( 'd', -21, $4AdvDat)
$TotSoDat = _DateAdd( 'd', -28, $4AdvDat)
$BuBDat = _DateAdd( 'd', -32, $4AdvDat)
ExitLoop
EndIf
Next
$HDays[11][0] = $WFastDate & "\Weiberfastnacht"
$HDays[12][0] = $RosDat & "\Rosenmontag"
$HDays[13][0] = $FastDat & "\Fastnacht"
$HDays[14][0] = $AschDat & "\Aschermittwoch"
$HDays[15][0] = $GrDoDat & "\Gründonnerstag"
$HDays[16][0] = $KarDat & "\Karfreitag"
$HDays[17][0] = $OSaDat & "\Ostersamstag"
$HDays[18][0] = $OSoDat & "\Ostersonntag"
$HDays[19][0] = $OMoDat & "\Ostermontag"
$HDays[20][0] = $HiFaDat & "\Christi Himmelfahrt"
$HDays[21][0] = $PfSoDat & "\Pfingstsonntag"
$HDays[22][0] = $PfMoDat & "\Pfingstmontag"
$HDays[23][0] = $MutterDat & "\Muttertag"
$HDays[24][0] = $FroDat & "\Fronleichnam"
$HDays[25][0] = $ErnteDat & "\Erntedankfest"
$HDays[26][0] = $BuBDat & "\Buß- und Bettag"
$HDays[27][0] = $TotSoDat & "\Totensonntag"
$HDays[28][0] = $1AdvDat & "\1. Advent"
$HDays[29][0] = $2AdvDat & "\2. Advent"
$HDays[30][0] = $3AdvDat & "\3. Advent"
$HDays[31][0] = $4AdvDat & "\4. Advent"
_ArraySort($HDays, 0, 0, 10)
_ArraySort($HDays, 0, 11)
For $i = 0 To 31
If $DateTyp Then ; Datum konvertieren zu TT.MM.JJJJ
$tmp = StringSplit($HDays[$i][0], "\", 2)
$HDays[$i][0] = StringMid($tmp[0], 9) & "." & StringMid($tmp[0], 6, 2) & "." & StringMid($tmp[0], 1, 4)
$HDays[$i][1] = $tmp[1]
Else
$HDays[$i][1] = StringTrimLeft($HDays[$i][0], 11)
$HDays[$i][0] = StringLeft($HDays[$i][0], 10)
EndIf
Next
Return $HDays
EndFunc ;==>_Feiertage
#endregion - Funktionen
_Feiertage( )
$ret = _Feiertage(2009, 1, 1, 1)
_ArrayDisplay($ret)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Funktion _Feiertage($Jahr)
;
; gibt die Feiertage des übergebenen Jahres
; als sortiertes Array[TT.MM.JJJJ od. JJJJ/MM/TT][Feiertag][Geltungsbereich][opt. Wochentag] zurück
; Geltungsbereich Leerstring - kein offizieller Feiertag
; BG - Bundesweit Gesetzlich
; Regionalkennzeichen: BB-Brandenburg BE-Berlin BW-Baden-Württemberg BY-Bayern
; HB-Bremen HE-Hessen HH-Hamburg MV-Mecklenburg-Vorpommern
; NI-Niedersachsen NW-Nordrhein-Westfalen RP-Rheinland-Pfalz
; SH-Schleswig-Holstein SL-Saarland SN-Sachsen
; ST-Sachsen-Anhalt TH-Thüringen
; $DateTyp 1 - Datum als TT.MM.JJJJ (Standard)
; 0 - Datum als JJJJ/MM/TT
; $wDay 0 - keine Rückgabe Wochentag (Standard)
; 1 - Rückgabe Wochentag ($array[n][3])
; $sort 0 - gegliedert fix/variabel (Standard), innerhalb sortiert
; 1 - komplett sortiert
; Autor BugFix ([email='bug_fix@web.de'][/email])
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include-once
#include <Array.au3>
#include <Date.au3>
Func _Feiertage($year, $DateTyp=1, $wDay=0, $sort=0)
Local $4AdvDat, $3AdvDat, $2AdvDat, $1AdvDat, $TotSoDat, $BuBDat, $MutterDat, $ErnteDat, $tmp
Local $HDays[33][3], $a, $b, $c, $d, $e, $H1, $H2, $N, $M
;fixe Feiertage
$HDays[0][0] = $year & "/01/01\Neujahr\GB"
$HDays[1][0] = $year & "/01/06\Heilige Drei Könige\BW BY ST"
$HDays[2][0] = $year & "/02/14\Valentinstag\"
$HDays[3][0] = $year & "/05/01\Maifeiertag\GB"
$HDays[4][0] = $year & "/08/15\Mariä Himmelfahrt\BY SL"
$HDays[5][0] = $year & "/10/03\Tag der Deutschen Einheit\GB"
$HDays[6][0] = $year & "/10/31\Reformationstag\BB MV SN ST TH"
$HDays[7][0] = $year & "/11/01\Allerheiligen\BW BY NW RP SL"
$HDays[8][0] = $year & "/12/24\Heiligabend\"
$HDays[9][0] = $year & "/12/25\1. Weihnachtsfeiertag\GB"
$HDays[10][0] = $year & "/12/26\2. Weihnachtsfeiertag\GB"
$HDays[11][0] = $year & "/12/31\Silvester\"
;variable Feiertage
$a = Mod($year, 19)
$b = Mod($year, 4)
$c = Mod($year, 7)
$H1 = Int($year / 100)
$H2 = Int($year / 400)
$N = 4 + $H1 - $H2
$M = 15 + $H1 - $H2 - Floor (Int((8 * $H1 + 13) / 25))
$d = Mod((19 * $a + $M), 30)
$e = Mod((2 * $b + 4 * $c + 6 * $d + $N), 7)
If $d + $e = 35 Then
$Easter = 50
Else
If $d = 28 And $e = 6 And $a > 10 Then
$Easter = 49
Else
$Easter = 22 + $d + $e
EndIf
EndIf
If $Easter < 32 Then
$EasterDay = $Easter
$EasterMonth = "03"
Else
$EasterDay = $Easter - 31
$EasterMonth = "04"
EndIf
If $EasterDay < 10 Then
$EasterDay = "0" & $EasterDay
EndIf
If $year < 1900 Then ; Datumsoperationen nur mgl. wenn > 1900 , Jahr wird konvertiert
$RestJahr = Mod($year, 100)
If _DateIsLeapYear($year) Then
If $RestJahr < 10 Then
$RestJahr = "0" & $RestJahr
EndIf
$Tempyear = 20 & $RestJahr
Else
If $RestJahr < 10 Then
$RestJahr = "0" & $RestJahr
EndIf
$Tempyear = 19 & $RestJahr
EndIf
$EasterDate = $Tempyear & "/" & $EasterMonth & "/" & $EasterDay
Else
$EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay
EndIf
$WFastDate = _DateAdd( 'd', -52, $EasterDate)
$RosDat = _DateAdd( 'd', -48, $EasterDate)
$FastDat = _DateAdd( 'd', -47, $EasterDate)
$AschDat = _DateAdd( 'd', -46, $EasterDate)
$GrDoDat = _DateAdd( 'd', -3, $EasterDate)
$KarDat = _DateAdd( 'd', -2, $EasterDate)
$OSaDat = _DateAdd( 'd', -1, $EasterDate)
$OSoDat = $EasterDate
$OMoDat = _DateAdd( 'd', 1, $EasterDate)
$HiFaDat = _DateAdd( 'd', 39, $EasterDate)
$PfSoDat = _DateAdd( 'd', 49, $EasterDate)
$PfMoDat = _DateAdd( 'd', 50, $EasterDate)
$FroDat = _DateAdd( 'd', 60, $EasterDate)
; Ermitteln nicht von Ostern abhängiger, veränderlicher Feiertage
; Muttertag = 2. Sonntag im Mai ABER wenn Pfingsten = 2.Sonntag im Mai dann ist Muttertag am 1. Sonntag
; Der 2. Sonntag kann nur zw. dem 8. u. 14.5. liegen
For $maitag = 8 To 14
If _DateToDayOfWeek($year, 5, $maitag) = 1 Then
If $maitag < 10 Then
$maitag = "0" & $maitag
EndIf
$MutterDat = $year & "/05/" & $maitag
If $MutterDat = $PfSoDat Then
$MutterDat = _DateAdd( 'd', -7, $year & "/05/" & $maitag)
EndIf
ExitLoop
EndIf
Next
; Erntedankfest 1. Sonntag im Oktober (zw. 1. u. 7.10.)
For $oktobertag = 1 To 7
If _DateToDayOfWeek($year, 10, $oktobertag) = 1 Then
$oktobertag = "0" & $oktobertag
$ErnteDat = $year & "/10/" & $oktobertag
ExitLoop
EndIf
Next
; 4.Advent = Sonntag vor 25.12. (zw. 18. u. 24.12.)
For $deztag = 18 To 24
If _DateToDayOfWeek($year, 12, $deztag) = 1 Then
$4AdvDat = $year & "/12/" & $deztag
$3AdvDat = _DateAdd( 'd', -7, $4AdvDat)
$2AdvDat = _DateAdd( 'd', -14, $4AdvDat)
$1AdvDat = _DateAdd( 'd', -21, $4AdvDat)
$TotSoDat = _DateAdd( 'd', -28, $4AdvDat)
$BuBDat = _DateAdd( 'd', -32, $4AdvDat)
ExitLoop
EndIf
Next
$HDays[12][0] = $WFastDate & "\Weiberfastnacht\"
$HDays[13][0] = $RosDat & "\Rosenmontag\"
$HDays[14][0] = $FastDat & "\Fastnacht\"
$HDays[15][0] = $AschDat & "\Aschermittwoch\"
$HDays[16][0] = $GrDoDat & "\Gründonnerstag\"
$HDays[17][0] = $KarDat & "\Karfreitag\BG"
$HDays[18][0] = $OSaDat & "\Ostersamstag\"
$HDays[19][0] = $OSoDat & "\Ostersonntag\"
$HDays[20][0] = $OMoDat & "\Ostermontag\BG"
$HDays[21][0] = $HiFaDat & "\Christi Himmelfahrt\BG"
$HDays[22][0] = $PfSoDat & "\Pfingstsonntag\"
$HDays[23][0] = $PfMoDat & "\Pfingstmontag\BG"
$HDays[24][0] = $MutterDat & "\Muttertag\"
$HDays[25][0] = $FroDat & "\Fronleichnam\BW BY HE NW RP SL SN TH"
$HDays[26][0] = $ErnteDat & "\Erntedankfest\"
$HDays[27][0] = $BuBDat & "\Buß- und Bettag\SN"
$HDays[28][0] = $TotSoDat & "\Totensonntag\"
$HDays[29][0] = $1AdvDat & "\1. Advent\"
$HDays[30][0] = $2AdvDat & "\2. Advent\"
$HDays[31][0] = $3AdvDat & "\3. Advent\"
$HDays[32][0] = $4AdvDat & "\4. Advent\"
If $sort Then
_ArraySort($HDays)
Else
_ArraySort($HDays, 0, 0, 11)
_ArraySort($HDays, 0, 12)
EndIf
If $wDay Then ReDim $HDays[33][4]
For $i = 0 To 32
$tmp = StringSplit($HDays[$i][0], "\", 2)
If $DateTyp Then ; Datum konvertieren zu TT.MM.JJJJ
$HDays[$i][0] = StringRight($tmp[0],2) & "." & StringMid($tmp[0],6,2) & "." & StringLeft($tmp[0],4)
If $wDay Then $HDays[$i][3] = _DateToDayOfWeek(StringLeft($tmp[0],4), StringMid($tmp[0],6,2), StringRight($tmp[0],2))
Else
$HDays[$i][0] = $tmp[0]
EndIf
$HDays[$i][1] = $tmp[1]
$HDays[$i][2] = $tmp[2]
If $wDay Then $HDays[$i][3] = _DateToDayOfWeek(StringLeft($tmp[0],4), StringMid($tmp[0],6,2), StringRight($tmp[0],2))
Next
Return $HDays
EndFunc ;==>_Feiertage