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