US Federal Holiday Detection

Here's how to determine whether a date is a US federal holiday using F#. You probably want to curry the first two boolean parameters with the appropriate settings (some departments observe Sunday holidays on Monday, and some observe Saturday holidays on Friday).

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
open System  

let getHoliday sunToMon satToFri (date:DateTime) =  
   match date.Month, date.Day, (date.Day-1)/7+1, date.DayOfWeek with
   | 1, 1, _, _ -> "New Year's Day"  
   | 1, 2, _, DayOfWeek.Monday when sunToMon -> "New Year's Day (observed)"  
   | 1, _, 3, DayOfWeek.Monday -> "Martin Luther King, Jr. Day"  
   | 2, _, 3, DayOfWeek.Monday -> "Presidents Day"  
   | 5, d, _, DayOfWeek.Monday when d >= 25 -> "Memorial Day" // active pattern matching!
   | 7, 3, _, DayOfWeek.Friday when satToFri -> "Independence Day (observed)"  
   | 7, 4, _, _ -> "Independence Day"  
   | 7, 5, _, DayOfWeek.Monday when sunToMon -> "Independence Day (observed)"  
   | 9, _, 1, DayOfWeek.Monday -> "Labor Day"  
   | 10, _, 2, DayOfWeek.Monday -> "Columbus Day"  
   | 11, 10, _, DayOfWeek.Friday when satToFri -> "Veterans Day (observed)"  
   | 11, 11, _, _ -> "Veterans Day"  
   | 11, 12, _, DayOfWeek.Monday when sunToMon -> "Veterans Day (observed)"  
   | 11, _, 4, DayOfWeek.Thursday -> "Thanksgiving Day"  
   | 12, 24, _, DayOfWeek.Friday when satToFri -> "Christmas Day (observed)"  
   | 12, 25, _, _ -> "Christmas Day"  
   | 12, 26, _, DayOfWeek.Monday when sunToMon -> "Christmas Day (observed)"  
   | 12, 31, _, DayOfWeek.Friday when satToFri -> "New Year's Day (observed)"  
   | _ -> null
namespace System
val getHoliday : sunToMon:bool -> satToFri:bool -> date:DateTime -> string

Full name: USFederalHolidays.getHoliday
val sunToMon : bool
val satToFri : bool
val date : DateTime
Multiple items
type DateTime =
  struct
    new : ticks:int64 -> DateTime + 10 overloads
    member Add : value:TimeSpan -> DateTime
    member AddDays : value:float -> DateTime
    member AddHours : value:float -> DateTime
    member AddMilliseconds : value:float -> DateTime
    member AddMinutes : value:float -> DateTime
    member AddMonths : months:int -> DateTime
    member AddSeconds : value:float -> DateTime
    member AddTicks : value:int64 -> DateTime
    member AddYears : value:int -> DateTime
    ...
  end

Full name: System.DateTime

--------------------
DateTime()
   (+0 other overloads)
DateTime(ticks: int64) : unit
   (+0 other overloads)
DateTime(ticks: int64, kind: DateTimeKind) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int, calendar: Globalization.Calendar) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, kind: DateTimeKind) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, calendar: Globalization.Calendar) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int) : unit
   (+0 other overloads)
DateTime(year: int, month: int, day: int, hour: int, minute: int, second: int, millisecond: int, kind: DateTimeKind) : unit
   (+0 other overloads)
property DateTime.Month: int
property DateTime.Day: int
property DateTime.DayOfWeek: DayOfWeek
type DayOfWeek =
  | Sunday = 0
  | Monday = 1
  | Tuesday = 2
  | Wednesday = 3
  | Thursday = 4
  | Friday = 5
  | Saturday = 6

Full name: System.DayOfWeek
field DayOfWeek.Monday = 1
val d : int
field DayOfWeek.Friday = 5
field DayOfWeek.Thursday = 4