#include-once #include ;=============================================================================== ; Function Name: _IsHoliday($iYear, $iMon=-1, $iDay=-1) ; Description:: Checks if given date is an holiday ; Parameter(s): $iYear year of date (as from 1900) OR ; entire date as string "YYYY/MM/DD" ; $iMon month of date (if $iYear not entire date) ; $iDay day of date (if $iYear not entire date) ; Requirement(s): #include ; Return Value(s): Success ; is Holiday - name of holiday ; isn't Holiday - blank string ; Failure ; 0 @error=1 - date isn't valid ; Note: you can insert own days as holiday ; Author(s): BugFix (bugfix@autoit.de) ;=============================================================================== Func _IsHoliday($iYear, $iMon=-1, $iDay=-1) Local $aDate = StringRegExp($iYear, '(\d{4})/(\d{1,2})/(\d{1,2})', 3) If Not @error Then $iYear = $aDate[0] $iMon = $aDate[1] $iDay = $aDate[2] EndIf If $iYear < 1900 Or $iMon < 1 Or $iMon > 12 Or $iDay < 1 Or $iDay > 31 Then Return SetError(1,0,0) $iMon = StringRight('0' & $iMon, 2) $iDay = StringRight('0' & $iDay, 2) If Not _DateIsValid($iYear & '/' & $iMon & '/' & $iDay) Then Return SetError(1,0,0) Local $oHoliday = ObjCreate('Scripting.Dictionary') Local $HDays[32][2], $a, $b, $c, $d, $e, $H1, $H2, $N, $M Local $Easter, $EasterDate, $EasterDay, $EasterMonth, $PfSoDat ; fix days $oHoliday.Add($iYear & "/01/01", "New Year's Day") $oHoliday.Add($iYear & "/05/01", "May Day") $oHoliday.Add($iYear & "/12/25", "Christmas Day") $oHoliday.Add($iYear & "/12/26", "Boxing Day") ; variable days $a = Mod($iYear, 19) $b = Mod($iYear, 4) $c = Mod($iYear, 7) $H1 = Int($iYear / 100) $H2 = Int($iYear / 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 $EasterDate = $iYear & "/" & $EasterMonth & "/" & $EasterDay $oHoliday.Add(_DateAdd( 'd', -2, $EasterDate) , "Good Friday") $oHoliday.Add($EasterDate , "Easter Sunday") $oHoliday.Add(_DateAdd( 'd', 1, $EasterDate) , "Easter Monday") $oHoliday.Add(_DateAdd( 'd', 39, $EasterDate) , "Ascension Thursday") $oHoliday.Add(_DateAdd( 'd', 49, $EasterDate) , "Whitsunday") $PfSoDat = _DateAdd( 'd', 50, $EasterDate) $oHoliday.Add($PfSoDat, "Whit Monday") #region - other days that may be an holiday, activate if needed #cs Local $MutterDat, $4AdvDat ; Mother's Day = 2. Sunday of May BUT if Whit = 2. Sunday of May than Mother's Day at 1. Sunday ; 2. Sunday only between 8. and 14.5. For $maitag = 8 To 14 If _DateToDayOfWeek($iYear, 5, $maitag) = 1 Then If $maitag < 10 Then $maitag = "0" & $maitag EndIf $MutterDat = $iYear & "/05/" & $maitag If $MutterDat = $PfSoDat Then $MutterDat = _DateAdd( 'd', -7, $iYear & "/05/" & $maitag) EndIf ExitLoop EndIf Next $oHoliday.Add($MutterDat, "Mother's Day") ; Thanksgiving 1. Sunday of October (between 1. and 7.10.) For $oktobertag = 1 To 7 If _DateToDayOfWeek($iYear, 10, $oktobertag) = 1 Then $oktobertag = "0" & $oktobertag $oHoliday.Add($iYear & "/10/" & $oktobertag, "Thanksgiving") ExitLoop EndIf Next ; 4.advent = Sunday before 25.12. (between 18. and 24.12.) For $deztag = 18 To 24 If _DateToDayOfWeek($iYear, 12, $deztag) = 1 Then $4AdvDat = $iYear & "/12/" & $deztag $oHoliday.Add(_DateAdd( 'd', -7, $4AdvDat), "3. Advent") $oHoliday.Add(_DateAdd( 'd', -14, $4AdvDat), "2. Advent") $oHoliday.Add(_DateAdd( 'd', -21, $4AdvDat), "1. Advent") $oHoliday.Add(_DateAdd( 'd', -28, $4AdvDat), "Sunday before Advent on which the dead are commemorated") $oHoliday.Add(_DateAdd( 'd', -32, $4AdvDat), "Day of Prayer and Repentance") ExitLoop EndIf Next $oHoliday.Add(_DateAdd( 'd', -48, $EasterDate), "Monday before Lent") $oHoliday.Add(_DateAdd( 'd', -47, $EasterDate), "Shrove Tuesday") $oHoliday.Add(_DateAdd( 'd', -46, $EasterDate), "ash wednesday") $oHoliday.Add(_DateAdd( 'd', -3, $EasterDate), "Holy Thursday") $oHoliday.Add(_DateAdd( 'd', 60, $EasterDate), "Corpus Christi") $oHoliday.Add($iYear & "/01/06", "Epiphany") $oHoliday.Add($iYear & "/02/14", "Valentine's Day") $oHoliday.Add($iYear & "/10/31", "Reformation Day") $oHoliday.Add($iYear & "/11/01", "All Saints' Day") $oHoliday.Add($iYear & "/12/24", "Christmas Eve") $oHoliday.Add($iYear & "/12/31", "New Year's Eve") $oHoliday.Add($4AdvDat, "4. Advent") ; ######### Here you can insert own holidays ####################### ; $oHoliday.Add('YYYY/MM/DD', 'Name of holiday') <== SAMPLE ; ################################################################## #ce #endregion If $oHoliday.Exists($iYear & '/' & $iMon & '/' & $iDay) Then Return $oHoliday.Item($iYear & '/' & $iMon & '/' & $iDay) Else Return '' EndIf EndFunc ;==>_IsHoliday