Imports Microsoft.VisualBasic.DateAndTime

Public Class cArbeitstage
    Public arbtage As Integer
    Public monatstage(11) As Integer
    Public Property arbeitstage_imjahr(ByVal zahl As Integer) As Integer
        Get
            Return monatstage(zahl)
        End Get
        Set(ByVal anz As Integer)
        End Set
    End Property
    Public Property arbeitstage_immonat() As Integer
        Get
            Return arbtage
        End Get
        Set(ByVal anz As Integer)
        End Set
    End Property

    Public Function Ostern(ByVal x As Integer) As Date
        Dim K, M, S, D, R, A, OG, SZ, OE, OSI As Integer
        Dim OS1 As Double
        Dim OS2 As String
        K = Int(x / 100)
        M = 15 + Int((3 * K + 3) / 4) - Int((8 * K + 13) / 25)
        S = 2 - Int((3 * K + 3) / 4)
        A = x Mod 19
        D = (19 * A + M) Mod 30
        R = Int(D / 29) + (Int(D / 28) - Int(D / 29)) * Int(A / 11)
        OG = 21 + D - R
        SZ = 7 - (x + Int(x / 4) + S) Mod 7
        OE = 7 - (OG - SZ) Mod 7
        OSI = ((OG + OE) - 1)
        OS2 = "01.03." & x
        OS2 = CDate(OS2)
        Dim da As New Date
        da = OS2
        OS1 = CType(da.ToOADate(), Double)
        OS1 = CType(da.ToOADate(), Double)
        OS1 = OS1 + OSI
        Ostern = CType(Date.FromOADate(OS1), Date)
    End Function

    Public Function arbeitstag(ByVal x As Date) As Boolean
        Dim feiertage(12) As Date
        Dim feiertag As String
        Dim jahr, SaSo, Arbeitst, i As Integer
        jahr = CInt(Format(x, "yyyy"))
        SaSo = CInt(Weekday(x))
        arbeitstag = True
        If (SaSo = 1 Or SaSo = 7) Then
            arbeitstag = False
        Else
            feiertage(1) = DateAdd(DateInterval.Day, -2, Ostern(jahr))
            feiertage(2) = DateAdd(DateInterval.Day, +1, Ostern(jahr))
            feiertage(3) = DateAdd(DateInterval.Day, +50, Ostern(jahr))
            feiertage(4) = DateAdd(DateInterval.Day, +39, Ostern(jahr))
            feiertage(5) = DateAdd(DateInterval.Day, +60, Ostern(jahr))

            feiertage(6) = (CDate("01.01." & jahr))
            feiertage(7) = (CDate("01.05." & jahr))
            feiertage(8) = (CDate("03.10." & jahr))
            feiertage(9) = (CDate("01.11." & jahr))
            feiertage(10) = (CDate("25.12." & jahr))
            feiertage(11) = (CDate("26.12." & jahr))

            For i = 1 To 11
                If x = feiertage(i) Then
                    arbeitstag = False
                    Exit For
                End If
            Next
        End If
    End Function

    Public Function arbeitstage(ByVal x_dat As Date, ByVal zahl As Integer)
        Dim tage, m, anz, i As Integer
        Dim wert As String
        ' unterscheiden, ob Jahres oder Monatsberechnung
        ' anhand Parameter "zahl"
        Select Case zahl
            Case 1
                ' jeden Monat durchlaufen
                For m = 1 To 12
                    Dim datum As New Date
                    datum = "#01/" & m & "/" & Year(x_dat) & "#"
                    ' Anzahl der Tage im Monat ermitteln
                    tage = Date.DaysInMonth(Year(x_dat), Month(datum))
                    anz = 0
                    ' alle Tage überprüfen ob Arbeitstag!
                    For i = 1 To tage
                        wert = "#" & i & "/" & m & "/" & Year(x_dat) & "#"
                        If arbeitstag(wert) Then
                            anz = anz + 1
                        End If
                    Next
                    ' Anzahl der Arbeitstage im Array speichern
                    monatstage(m - 1) = anz
                Next
            Case 2
                ' Anzahl der Tage im Monat ermitteln
                tage = Date.DaysInMonth(Year(x_dat), Month(x_dat))
                ' alle Tage überprüfen ob Arbeitstag!
                For i = 1 To tage
                    wert = "#" & i & "/" & Month(x_dat) & "/" & Year(x_dat) & "#"
                    If arbeitstag(wert) Then
                        anz = anz + 1
                    End If
                Next
                ' Anzahl der Arbeitstage speichern
                arbtage = anz
        End Select
        Return anz
    End Function
End Class
