簡體   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