相当初学者的问题:给定一个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天返回并过滤非周末的序列,最后取第一个...
答案 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
在这里,我们不需要改变任何事情。