[英]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
版本,您的測試將是:
這也使您可以輕松地進行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_old
和fn
參數的順序,因為這使您可以編寫在管道中有意義的代碼:
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.