F#上一个工作日期

时间:2017-12-22 18:28:32

标签: f#

相当初学者的问题:给定一个DateTime,我想找到F#中的上一个非周末日期。因此我创造了这个:

open System

module Date =

  let isWeekEnd (date:DateTime) =
      ((date.DayOfWeek = DayOfWeek.Saturday) || (date.DayOfWeek = DayOfWeek.Sunday))

  let getPreviousWorkDay date =
      while isWeekEnd date do
          let date = date.AddDays -1.0
      date

但是,似乎我违反了日期不可变的事实。因此我想知道如何使用while循环执行此操作,为什么不通过检索最多3天返回并过滤非周末的序列,最后取第一个...

2 个答案:

答案 0 :(得分:3)

如果你想使用while循环方法,你需要将date声明为mutable:

let getPreviousWorkDay d =
    let mutable date = d
    while isWeekEnd date do
      date <- date.AddDays -1.0
    date

否则你可以使用递归:

let rec getPreviousWorkDay date =
    let prevDate = date.AddDays -1.0
    if isWeekEnd prevDate then getPreviousWorkDay prevDate
    else prevDate

请注意,如果你想要的东西真的要去前一天,然后如果它是一个周末再往后走,你的功能将留在发送工作日。但你可以通过已经减去的一天来解决它:

let getPreviousWorkDay (date:DateTime) =
  let rec loop date =
        if isWeekEnd date then loop (date.AddDays -1.0)
        else date
  loop (date.AddDays -1.0)

答案 1 :(得分:1)

使用while循环的本质意味着你将会改变某些东西。如果您不想这样做而宁愿使用功能更强大的解决方案,那么您可以使用match表达式:

module Date =
    let getPreviousWorkDay (date:DateTime) =
        match date.DayOfWeek with
        | DayOfWeek.Monday -> date.AddDays -3.0
        | DayOfWeek.Sunday -> date.AddDays -2.0
        | _ -> date.AddDays  -1.0

在这里,我们不需要改变任何事情。