Results 1 to 8 of 8

Thread: Calculate Holidays

Threaded View

  1. #1

    Thread Starter
    Powered By Medtronic dbasnett's Avatar
    Join Date
    Dec 2007
    Location
    Jefferson City, MO
    Posts
    9,764

    Calculate Holidays

    A way to generate Holidays. Several are defined in the Class:

    Code:
        Public Class MyHolidays
    
            Private Class DefHolidays
                Property Name As String
                Property HolidayMonth As Integer = -1
                Property HolidayDayOfMonth As Integer = -1
                Property HolidayDate As DateTime
                Property Nth As Integer = -1 '-1 last NthDayOfWeek <<<<<<<<<<
                Property NthDayOfWeek As DayOfWeek
                Property EasterCalc As Boolean = False
                Property enabled As Boolean = True
            End Class
    
            Private holidays As New Dictionary(Of String, DefHolidays)
            Private whYear As Integer
            Public Easter As DateTime = DateTime.MinValue
    
            ''' <summary>
            ''' creates holidays for the given year
            ''' </summary>
            ''' <param name="year"></param>
            ''' <remarks></remarks>
            Public Sub New(year As Integer)
                Me.whYear = year
    
                Dim holiday As DefHolidays
    
                'what follows are the holidays
                'add / remove / disable per your requirement
    
                holiday = New DefHolidays
                With holiday
                    .Name = "New Year's Day"
                    .HolidayMonth = 1
                    .HolidayDayOfMonth = 1
                    '.enabled = False 'how to disable a holiday
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Martin Luther King Jr. Day" 'third monday january
                    .Nth = 3
                    .NthDayOfWeek = DayOfWeek.Monday
                    .HolidayMonth = 1
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Groundhog Day"
                    .HolidayMonth = 2
                    .HolidayDayOfMonth = 2
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Valentine's Day"
                    .HolidayMonth = 2
                    .HolidayDayOfMonth = 14
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Presidents Day" 'second monday of Feb.
                    .Nth = 3
                    .NthDayOfWeek = DayOfWeek.Monday
                    .HolidayMonth = 2
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "St. Patrick's Day"
                    .HolidayMonth = 3
                    .HolidayDayOfMonth = 17
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "April Fools' Day"
                    .HolidayMonth = 4
                    .HolidayDayOfMonth = 1
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                'easter defined before holidays based on easter
                holiday = New DefHolidays
                With holiday
                    .Name = "Easter Sunday"
                    .EasterCalc = True
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Palm Sunday"
                    .EasterCalc = True
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Good Friday"
                    .EasterCalc = True
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Patriot's Day"
                    .Nth = 3
                    .NthDayOfWeek = DayOfWeek.Monday
                    .HolidayMonth = 4
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Earth Day"
                    .HolidayMonth = 4
                    .HolidayDayOfMonth = 22
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Arbor Day" 'last fri in apr ,  .Nth = -1 (the default)
                    .NthDayOfWeek = DayOfWeek.Friday
                    .HolidayMonth = 4
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Mother's Day"
                    .Nth = 2
                    .NthDayOfWeek = DayOfWeek.Sunday
                    .HolidayMonth = 5
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Memorial Day"
                    .NthDayOfWeek = DayOfWeek.Monday
                    .HolidayMonth = 5
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Flag Day"
                    .HolidayMonth = 6
                    .HolidayDayOfMonth = 14
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Father's Day"
                    .Nth = 3
                    .NthDayOfWeek = DayOfWeek.Sunday
                    .HolidayMonth = 6
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Independence Day"
                    .HolidayMonth = 7
                    .HolidayDayOfMonth = 4
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Labor Day"
                    .Nth = 1
                    .NthDayOfWeek = DayOfWeek.Monday
                    .HolidayMonth = 9
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Columbus Day"
                    .Nth = 2
                    .NthDayOfWeek = DayOfWeek.Monday
                    .HolidayMonth = 10
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Halloween"
                    .HolidayMonth = 10
                    .HolidayDayOfMonth = 31
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Veterans Day"
                    .HolidayMonth = 11
                    .HolidayDayOfMonth = 11
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Thanksgiving"
                    .Nth = 4
                    .NthDayOfWeek = DayOfWeek.Thursday
                    .HolidayMonth = 11
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Pearl Harbor Remembrance Day"
                    .HolidayMonth = 12
                    .HolidayDayOfMonth = 7
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Christmas Eve"
                    .HolidayMonth = 12
                    .HolidayDayOfMonth = 24
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "Christmas Day"
                    .HolidayMonth = 12
                    .HolidayDayOfMonth = 25
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
                holiday = New DefHolidays
                With holiday
                    .Name = "New Year's Eve"
                    .HolidayMonth = 12
                    .HolidayDayOfMonth = 31
                End With
                Me.holidays.Add(holiday.Name, holiday)
                Me.CalcDate(holiday)
    
            End Sub
    
            Private Function CalcDate(holiday As DefHolidays) As DateTime
                If holiday.EasterCalc Then
                    If holiday.Name.StartsWith("Easter") Then
                        'easter
                        'VB .Net implementation of:
                        'http://aa.usno.navy.mil/faq/docs/easter.php
                        Dim y As Integer = Me.whYear
                        Dim c, d, i, j, k, l, m, n As Integer
                        c = y \ 100
                        n = y Mod 19
                        k = (c - 17) \ 25
                        i = c - c \ 4 - (c - k) \ 3 + 19 * n + 15
                        i = i Mod 30
                        i = i - (i \ 28) * (1 - (i \ 28) * (29 \ (i + 1)) * ((21 - n) \ 11))
                        j = y + y \ 4 + i + 2 - c + c \ 4
                        j = j Mod 7
                        l = i - j
                        m = 3 + (l + 40) \ 44
                        d = l + 28 - 31 * (m \ 4)
                        holiday.HolidayMonth = m
                        holiday.HolidayDayOfMonth = d
                        Me.Easter = New DateTime(y, m, d)
    
                    ElseIf holiday.Name.Contains(DayOfWeek.Friday.ToString) Then
                        'good friday - friday before easter sunday
                        holiday.HolidayMonth = Me.Easter.AddDays(-2).Month
                        holiday.HolidayDayOfMonth = Me.Easter.AddDays(-2).Day
    
                    ElseIf holiday.Name.Contains(DayOfWeek.Sunday.ToString) Then
                        'palm sunday - sunday before easter
                        holiday.HolidayMonth = Me.Easter.AddDays(-7).Month
                        holiday.HolidayDayOfMonth = Me.Easter.AddDays(-7).Day
                    End If
    
                ElseIf holiday.HolidayMonth = -1 OrElse holiday.HolidayDayOfMonth = -1 Then
                    If holiday.Nth < 1 Then
                        'last NthDayOfWeek
                        Dim dt As DateTime = New DateTime(Me.whYear, holiday.HolidayMonth, DateTime.DaysInMonth(Me.whYear, holiday.HolidayMonth))
                        Do While dt.DayOfWeek <> holiday.NthDayOfWeek
                            dt = dt.AddDays(-1)
                        Loop
                        holiday.HolidayDayOfMonth = dt.Day
                    Else
                        Dim dt As DateTime = New DateTime(Me.whYear, holiday.HolidayMonth, 1)
                        For x As Integer = 1 To holiday.Nth
                            Do While dt.DayOfWeek <> holiday.NthDayOfWeek
                                dt = dt.AddDays(1)
                            Loop
                            dt = dt.AddDays(1)
                        Next
                        dt = dt.AddDays(-1)
                        holiday.HolidayDayOfMonth = dt.Day
                    End If
                End If
                holiday.HolidayDate = New DateTime(Me.whYear, holiday.HolidayMonth, holiday.HolidayDayOfMonth)
                Return holiday.HolidayDate
            End Function
    
            ''' <summary>
            ''' returns a list of Holidays
            ''' </summary>
            ''' <returns></returns>
            ''' <remarks></remarks>
            Public Function HolidayList() As List(Of String)
                Dim rv As New List(Of String)
                For Each h As DefHolidays In Me.holidays.Values.OrderBy(Function(d) d.HolidayDate)
                    If h.enabled Then
                        rv.Add(String.Format("{0},  {1},  {2}", h.Name, h.HolidayDate.DayOfWeek, h.HolidayDate.ToString("MMMM d, yyyy")))
                    End If
                Next
                Return rv
            End Function
    
            ''' <summary>
            ''' check if date is a holiday
            ''' </summary>
            ''' <param name="SomeDateInYear">a date.  year must match year for list of holidays</param>
            ''' <returns>true if is a holiday, otherwise false</returns>
            ''' <remarks></remarks>
            Public Function isHoliday(SomeDateInYear As DateTime) As Boolean
                If SomeDateInYear.Year <> Me.whYear Then
                    Throw New ArgumentException("These holidays are for " & Me.whYear.ToString)
                Else
                    Dim ct As Integer = (From d In Me.holidays.Values
                                        Where d.HolidayDate.Date = SomeDateInYear.Date AndAlso d.enabled
                                        Select d Take 1).Count
                    Return ct > 0
                End If
            End Function
    
        End Class
    Last edited by dbasnett; Nov 18th, 2014 at 05:46 AM.
    My First Computer -- Documentation Link (RT?M) -- Using the Debugger -- Prime Number Sieve
    Counting Bits -- Subnet Calculator -- UI Guidelines -- >> SerialPort Answer <<

    "Those who use Application.DoEvents have no idea what it does and those who know what it does never use it." John Wein

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width