Wochentag- Feiertagsermittlung

    • 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
    [autoit]

    #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

    [/autoit]


    Und hier nun das Ergebnis:

    Spoiler anzeigen
    [autoit]

    ; ----------------------------------------------------------------------------
    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    #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

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    #region - Funktionen
    Func Ende()
    Exit
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Minus()
    GUICtrlSetData($InYear, GUICtrlRead($InYear) - 1)
    _RunData()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Plus()
    GUICtrlSetData($InYear, GUICtrlRead($InYear) + 1)
    _RunData()
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; 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

    [/autoit]
    _Feiertage( )
    [autoit]

    $ret = _Feiertage(2009, 1, 1, 1)
    _ArrayDisplay($ret)

    [/autoit] [autoit][/autoit] [autoit]

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; 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

    [/autoit]
    • Offizieller Beitrag

    Hab noch alles da.
    Hier in voller Schönheit die GUI:

    Spoiler anzeigen

    Und hier noch die reine Feiertagsfunktion. Evtl. kann man hinter dem Feiertagsnamen das Bundeslandkürzel anhängen, sofern es kein allgemeingültiger Feiertag ist.

    Spoiler anzeigen


    Edit 18.04.2009 Die überarbeitete Version findet ihr in Post 1.

    • Offizieller Beitrag

    Was hat es mit den Jahren 1583 und 8201 auf sich?


    Das sind die Jahresgrenzen für die eine Ermittlung von Schaltjahren gesichert ist.
    Seit 1583 gilt der Gregorianische Kalender mit der aktuellen Schalttagesregelung.
    Es verbleibt jedoch immer noch eine Differenz, die sich bis zum Jahr 8201 summieren wird. Es ist heute noch nicht geregelt, wie dann damit umgegangen werden soll (z.B. einmalig 2 Schalttage?).
    Laß uns dann noch mal drüber reden :rofl:

  • Hallo BugFix ,

    deine neue Version gibt die Feiertage, die von Ostern ahängig sind manchmal (bis jetzt nur für vergangene Jahrhunderte aufgefallen) mit falschem Datum aus, z. 400 Jahre zuviel im Jahr 1600, 500 für 1596), ist sicher nur eine Kleinigkeit, aber den Bug solltest du fixen.

    Edit1: Wenn ich so abändere

    [autoit]

    #cs 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 #ce
    $EasterDate = $year & "/" & $EasterMonth & "/" & $EasterDay
    ;EndIf

    [/autoit]

    läufts, zumindest für alle Jahre größer 999 fällt mir dann kein Fehler mehr auf
    mfg (Auto)Bert

    2 Mal editiert, zuletzt von AutoBert (17. April 2009 um 23:06)

    • Offizieller Beitrag

    Die Eingabe des Datums ist zwar etwas unkonventionell, aber eigentlich ganz cool, weil man das Jahr einfach verändern kann.

    Allerdings hat sich dort ein Bug eingeschlichen, denn in einem Schaltjahr kann ich den 29. Februar nicht auswählen ("Tag für Berechnung auf 28 korrigiert!") und in einem "normalen" Jahr kann ich den 29. Februar auswählen, erhalte aber als Wochentag eine "0" und die Meldung: "Tag für Berechnung auf 29 korrigiert!".

  • Kann man da nicht eine If/Then Abfarge machen?

    Ist 29 & Feb. & Wochentagausgabe = 0 Dann nachfolgende Tage plus 1.

    Werde mir mal das aktuelle Script und später dann das neue Script nehmen und schauen was gefixt wurde. ;) Lerneffekt gleich mal ausnutzen !!!

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

    • Offizieller Beitrag

    Allerdings hat sich dort ein Bug eingeschlichen, denn in einem Schaltjahr kann ich den 29. Februar nicht auswählen ("Tag für Berechnung auf 28 korrigiert!") und in einem "normalen" Jahr kann ich den 29. Februar auswählen, erhalte aber als Wochentag eine "0" und die Meldung: "Tag für Berechnung auf 29 korrigiert!".


    Stimmt, habe die Abfrage abgeändert. Werde ich gleich mal korrigieren. Danke für den Hinweis.

    • Offizieller Beitrag

    Hab' mir das Script gerade mal angesehen. Stimmt, wenn man in der Funktion _WTag() bei der If-Anweisung:

    [autoit]

    If _DateIsLeapYear(GUICtrlRead($InYear)) Then

    [/autoit]


    ein Not einfügt,

    [autoit]

    If Not _DateIsLeapYear(GUICtrlRead($InYear)) Then

    [/autoit]


    funktioniert alles! :thumbup:

    Edit: Die übergeordnete If-Anweisung solltest Du auch noch etwas korrigieren, damit die Meldung "Tag für Berechnung auf 29 korrigiert!", obwohl man den 29. angeklickt hat, verschwindet:

    [autoit]


    If $mon = 2 and $day > (28 + _DateIsLeapYear(GUICtrlRead($InYear))) Then
    If Not _DateIsLeapYear(GUICtrlRead($InYear)) Then
    $day = 28
    GUICtrlSetState($aRadioT[27],$gui_checked)
    Else
    $day = 29
    GUICtrlSetState($aRadioT[28],$gui_checked)
    EndIf
    GUICtrlSetData($MsgTag,"'Tag' für Berechnung auf "& $day & " korrigiert!")
    EndIf

    [/autoit]
    • Offizieller Beitrag

    Die Funktion _Feiertage() habe ich erweitert. Es wird zusätzlich der Gültigkeitsbereich ausgegeben (BG = Bundesweit Gesetzlich; ISO-Kürzel BB, BE, BY... für Regionale Gesetzliche Feiertage).
    Die Daten können jetzt wahlweise gegliedert nach fixen und variablen Feiertagen (innerhalb sortiert) oder alle Feiertage gemeinsam sortiert ausgegeben werden.
    s. Post #1

  • Ah ok, damit habe ich jetzt nicht gerechnet 8|

    Ich habs nun doch zum laufen gebracht.

    Es lag dran wo die Includes stehen.

    So ist in deinem 1. Post

    So habe ich es geändert, damit es läuft