繁体   English   中英

F#如何比较两个DateTime值

[英]F# How to Compare Two DateTime Values

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

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

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

我对此功能为何总是返回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

我不确定您要做什么,但您总是会得到错误,因为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

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

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

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

现在,对于isFileStale这样的简单函数,可能没有必要。 但是要记住,这是一个很好的经验法则。 我建议编写以下函数 (因为它很棒,从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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM