F# 上一个工作日期(单位:F)#

F# 上一个工作日期(单位:F)#,f#,F#,相当初级的问题:给定日期时间,我想在F.中查找上一个非周末日期。我因此创造了这个: open System module Date = let isWeekEnd (date:DateTime) = ((date.DayOfWeek = DayOfWeek.Saturday) || (date.DayOfWeek = DayOfWeek.Sunday)) let getPreviousWorkDay date = while isWeekEnd date d

相当初级的问题:给定日期时间,我想在
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天的时间并过滤非周末的时间,最后使用第一个…

如果要使用while循环方法,则需要将日期声明为可变的:

let getPreviousWorkDay d =
    let mutable date = d
    while isWeekEnd date do
      date <- date.AddDays -1.0
    date
请注意,如果您真的希望在前一天执行,然后如果是周末,则返回更远的时间,在发送工作日的情况下,您的函数将保持不变。但你可以通过减去一天来解决这个问题:

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

使用
while
循环的本质意味着您将要变异某些东西。如果您不想这样做,而希望使用功能更强大的解决方案,则可以使用
匹配
表达式:

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

在这里,我们不需要变异任何东西。

看起来很棒!不可变属性使技巧,将测试这一点!工作,我冒昧地更正了循环函数(我正在使用),否则它只会给出当前日期。太棒了!我选择递归解决方案,但这一个更明确。
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