2013-07-26 35 views
-1

我得到這個小片段一個奇怪的錯誤:發生OverflowException上的日期時間差計算

private int CalculateDifference(DateTime date1, DateTime date2) 
{ 
    var difference = date1 - date2; 
    return Math.Abs((int)difference.TotalSeconds); 
} 

在我的情況下,我計算的總3520789176.4909997秒的差別。該計劃拋出異常從來就十年C#編碼從未見過:

System.OverflowException: "Negating the minimum value of a twos complement number is invalid."

I'm與浮點算術相當肯定it's,但我不明白的細節我只需要一個足夠的解決方案來確定兩個日期值的差異。

+1

閱讀本文http://stackoverflow.com/questions/6265381/c-sharp-short-error-negating-the-minimum-value-of-a-twos-complement-number-is-i –

+0

你是非常確定這是錯誤的。 –

+0

Int32.MaxValue秒數少於70年。 – Corak

回答

6

的問題是,當一個雙超過可在int —是-2,147,483,6482,147,483,647被表示的值的範圍,其結果是未定義根據C#規範(見下文Jeppe Stig Nielsen's comment),但在.NET實現,是int.MinValue。所以,當你轉換differenceint,它需要的價值,-2,147,483,648這則不能使用Math.Abs

如果轉換這種方法使用long而不是否定,它應該工作:

private long CalculateDifference(DateTime date1, DateTime date2) 
{ 
    var difference = date1 - date2; 
    return Math.Abs((long)difference.TotalSeconds); 
} 

你可以通過簡單地轉換爲int你採取的絕對值也後解決這個:

private int CalculateDifference(DateTime date1, DateTime date2) 
{ 
    var difference = date1 - date2; 
    return (int)Math.Abs(difference.TotalSeconds); 
} 
+0

您:_it取最接近的值-2,147,483,648_否,在此特定情況下,它需要***最遠的***值。有可能(並非完全肯定)在所有「不可能」的情況下產生「Int32.MinValue」。 C#規範說:(下一條評論) –

+0

「在未選中的上下文中,轉換總是成功,並按以下步驟進行: 如果操作數的值是NaN或無限,則轉換的結果是未指定的值目標類型 否則,源操作數向零取整到最接近的整數值,如果該整數值在目標類型的範圍內,則該值爲轉換結果 否則,轉換結果是目標類型的未指定值。「 –

+0

另一個解決方案是'difference.Duration().Ticks/TimeSpan.TicksPerSecond'(並且應該仍然返回'long')。看起來更笨拙,但避免將整數轉換爲浮點數並再次返回到整數。 –

0

msdn: Int.Maxvalue的值爲2,147,483,647

您的電話號碼似乎大於此值。