F#如何比较两个DateTime值

时间:2018-11-06 20:48:54

标签: datetime f# datetime-format

我一直在研究这个问题,但是我找到的答案是针对C#的,而不是针对F#的。看来我需要使用DateTime.Compare,但我希望有一个本机解决方案。

此功能的目的(以下)是确定一个文件的访问时间是否大于等于阈值。阈值是最后访问时间,从最后访问时间中减去天数。

days_old与文件名isFileStale一起传递到函数fn中。

我对此功能为何总是返回false感到困惑。

let isFileStale fn days_old  =
    let rc =
        let currentTime = ((System.DateTime.Now).ToLocalTime())
        let lastFileUsed = File.GetLastAccessTime(fn)
        let timeSpan = new TimeSpan(days_old, 0, 0, 0, 0)
        let fileDeleteThreshhold = lastFileUsed.Subtract(timeSpan)

        if fileDeleteThreshhold >= lastFileUsed then
            true
        else
            false
    rc

2 个答案:

答案 0 :(得分:5)

我不确定您要做什么,但您总是会出错,因为lastFileUsed.Subtract(timeSpan)(即您的fileDeleteThreshhold值)将始终低于lastFileUsed (或当days_old = 0时等于)

也许这就是您想要的:

let isFileStale fn days_old  =
    let currentTime = DateTime.Now
    let lastFileUsed = File.GetLastAccessTime(fn)
    (currentTime - lastFileUsed).Days >= days_old

答案 1 :(得分:1)

顺便说一句,顺便说一句,只要您在函数中使用DateTime.Now,我建议您将currentTime移到 pure 函数中参数。这使您的单元测试变得更加简单,因为您不必模拟DateTime.Now,只需要传递您希望成为该单元测试“当前”时间的时间即可。例如,要使用当前功能测试isFileStale,您的单元测试将必须检查当前时间,创建一个时间戳为(当前时间-N天)的文件,然后对该文件调用isFileStale 。但是使用isFileStale作为参数的currentTime版本,您的测试将是:

  • 使用时间戳记2010-01-01创建文件
  • 2010年1月7日大满7天了吗?答案应该为“否”。
  • 2010年1月8日大满7天了吗?答案应该是“是”。

这也使您可以轻松地进行2月29日之类的测试,而无需每隔四年在正确的时间精确地运行单元测试。

现在,对于像isFileStale这样的简单功能,可能没有必要。但是要记住,这是一个很好的经验法则。我建议编写以下 pair 函数(从gileCAD的代码开始,因为它非常出色):

let isFileStale currentTime days_old fn  =
    let lastFileUsed = File.GetLastAccessTime(fn)
    (currentTime - lastFileUsed).Days >= days_old

let isFileOlderThanNDays days_old fn =
    isFileStale DateTime.Now days_old fn

请注意,我交换了days_oldfn参数的顺序,因为这使您可以编写在管道中有意义的代码:

if "/path/to/file" |> isFileOlderThanNDays 7 then
    printfn "File is at least a week old"
else
    printfn "File is relatively fresh"