Adding Days to a Date but Excluding Weekends

前端 未结 11 2181
萌比男神i
萌比男神i 2020-12-01 15:47

Given a date how can I add a number of days to it, but exclude weekends. For example, given 11/12/2008 (Wednesday) and adding five will result in 11/19/2008 (Wednesday) rath

11条回答
  •  心在旅途
    2020-12-01 16:39

    F# flavor of http://stackoverflow.com/questions/1044688 's answer:

    namespace FSharpBasics
    
    module BusinessDays =
    
        open System;
    
        let private weekLength = 5
    
        (*operation*)
        let addBusinessDays (numberOfBusinessDays: int) (startDate: DateTime) =
            let startWeekDay = startDate.DayOfWeek
            let sign = Math.Sign(numberOfBusinessDays) 
            let weekendSlide, businessDaysSlide = 
                match startWeekDay with
                | DayOfWeek.Saturday when sign > 0 -> (2, -1)
                | DayOfWeek.Saturday when sign < 0 -> (-1, 1)   
                | DayOfWeek.Sunday when sign > 0 -> (1, -1)
                | DayOfWeek.Sunday when sign < 0 -> (-2, 1)
                | _ -> (0, 0)
            let baseStartDate = startDate.AddDays (float weekendSlide)        
            let days = Math.Abs (numberOfBusinessDays + businessDaysSlide) % weekLength
            let weeks = Math.Abs (numberOfBusinessDays + businessDaysSlide) / weekLength
            let baseWeekDay = int baseStartDate.DayOfWeek
            let oneMoreWeekend =
                if sign = 1 && days + baseWeekDay > 5 || sign = -1 && days >= baseWeekDay then 2
                else 0
            let totalDays = (weeks * 7) + days + oneMoreWeekend
            baseStartDate.AddDays (float totalDays)
    
        []
        let main argv =
            let now = DateTime.Now 
            printfn "Now is %A" now
            printfn "13 business days from now would be %A" (addBusinessDays 13 now)
            System.Console.ReadLine() |> ignore
            0 
    

提交回复
热议问题