2012-07-31 63 views
1

有沒有辦法檢查一個Delphi TDateTime變量是否有有效的內容,而不會捕獲轉換異常?如何檢查TDateTime內容是否有效

我已經寫了一個應用程序,必須通過數百個包含TDateTime字段的原始Delphi記錄編寫的巨大文件進行解析。偶爾我會得到一個記錄,其內容的TDateTime值爲2.0927117954e + 262,在傳遞到轉換例程時會產生Floating point invalid Operation異常。我知道我可以簡單地捕獲這個異常,但是當調試器不斷停止調試時,這是一件很麻煩的事情,我希望在出現其他錯誤的情況下保持啓用狀態。

+3

定義「有效內容」。 'TDateTime'基本上只是一個具有特殊語義的'Double'。每個值都是技術上有效的。如果您的轉換例程發生錯誤,請顯示實際的轉換例程,輸入值和錯誤。 – 2012-07-31 19:58:37

回答

10

您的示例值顯然超出了有效的DateTime範圍。您可以在執行任何轉換之前測試它是否在範圍內。

var 
    d: TDateTime; 
.. 

d := 2.0927117954e+262; 
if (d <= MaxDateTime) and (d >= MinDateTime) then 
    s := DateTimeToStr(d) 
else 
    .. 
4

如果你的問題是調試器停止,你可以修復後來的Delphi版本的IDE。在發生異常的行前後設置兩個斷點。例如。在Delphi 2007中,右鍵單擊第一個BP的邊距紅點,選擇BreakPoint屬性/高級/忽略後續異常。在第二個BP上,'處理隨後的異常'

+0

以前從未注意過。謝謝你的提示! – Peter 2012-08-02 03:20:27

3

我發現VCL包含一個完全爲此目的的函數,SysUtils.TryFloatToDateTime,並且使用它似乎是迄今爲止最好的選擇。

因爲我沒有德爾福在眼前,這裏是C++的使用實例 - 生成器:

bool isValidDateTime(const double dt) { 
    TDateTime dummy; 
    return Sysutils::TryFloatToDateTime(dt, dummy); 
} 

...「移植」它德爾福似乎很容易。

+0

不知道它,我認爲它不是*最好的選擇,但+ + 1. Ctrl +點擊它,你會發現它和我的答案一樣,比較MinDateTime的值和MaxDateTime。不過,根據我的回答,MaxDateTime的回答可能會是1。 – 2014-09-05 11:00:17

+0

@SertacAkyuz你的答案是我目前爲止最喜歡的答案,但函數(我已經檢查過它基本上是一樣的)更緊湊,同時也有一個表達性的名字。當我探索MinTimeValue和MaxTimeValue這兩個命名空間時,我偶然發現它...... – Wolf 2014-09-05 12:03:21