2017-07-20 75 views
1

我正在嘗試爲某些計算添加一些TimeSpans。
如:檢查添加TimeSpans是否超過TimeSpan.MaxValue

var timeSpan1 = new TimeSpan.FromMinutes(1); 
var timeSpan2 = new TimeSpan.MaxValue; 
var timeSpan3 = timeSpan1 + timeSpan2; 

在這種情況下,它會超過TimeSpan.MaxValue並拋出一個異常

System.OverflowException:時間跨度溢出,因爲持續時間過長。

什麼是添加TimeSpans的正確方法?

我是否必須嘗試一下,或者編寫自己的擴展方法?看起來像這應該是.Net框架的一部分 - 或者默認爲MaxValue或者有一個TryAdd方法。

+0

你爲什麼認爲拋出異常不是正確的行爲?考慮到如果'timeSpan3'產生'TimeSpan.MaxValue',你會打破數學規則,例如'timeSpan3 - timeSpan1!= timeSpan2'。 –

+0

@MattJohnson好點!但是,我的MaxValue用例是「無窮大」。所以'無限+無限=無限'。在這種情況下,我也不應該使用'無窮大 - 時間跨度= ...'並依靠結果。 – JumpingJezza

回答

2

我會用代數,並保持在TimeSpan單位的一切:

public static TimeSpan AddTimeSpan(this TimeSpan ts1, TimeSpan ts2) 
{ 
    bool sign1 = ts1 < TimeSpan.Zero, sign2 = ts2 < TimeSpan.Zero; 

    if (sign1 && sign2) 
    { 
     if (TimeSpan.MinValue - ts1 > ts2) 
     { 
      return TimeSpan.MinValue; 
     } 
    } 
    else if (!sign1 && !sign2) 
    { 
     if (TimeSpan.MaxValue - ts1 < ts2) 
     { 
      return TimeSpan.MaxValue; 
     } 
    } 

    return ts1 + ts2; 
} 

這樣的話,你可以利用TimeSpan不使其轉換爲其他單位,您可以放心,除了轉換過程中可能出現的其他潛在問題外,此補充功能還是可行的(我認爲可以安全地認爲TimeSpan範圍不會發生變化,因此TotalMinutes不再更改足夠了,但是當您接近TimeSpan.MinValueTimeSpan.MaxValue的限制時,您可能會在精確的加法結果中遇到一些不準確的情況。

+0

我最終轉而使用tick。比較TimeSpans稱這種方法3到4百萬次的性能打擊太大了 – JumpingJezza

0

我最終爲TimeSpan寫了一個擴展方法。還需要檢查TimeSpan.MinValue,因爲您可以添加負數。我開始檢查TimeSpans的Ticks,但我得到了一些奇怪的結果。顯然TimeSpan.MinValue.Ticks + TimeSpan.MinValue.Ticks = 2?

所以不是:

public static TimeSpan AddTimeSpan(this TimeSpan firstTimeSpan, TimeSpan secondTimeSpan) 
{ 
    if (firstTimeSpan.TotalMinutes + secondTimeSpan.TotalMinutes > TimeSpan.MaxValue.TotalMinutes) 
    { 
     return TimeSpan.MaxValue; 
    } 
    if (firstTimeSpan.TotalMinutes + secondTimeSpan.TotalMinutes < TimeSpan.MinValue.TotalMinutes) 
    { 
     return TimeSpan.MinValue; 
    } 
    return firstTimeSpan + secondTimeSpan; 
} 
+1

你可以查看提示的參考資源https://referencesource.microsoft.com/#mscorlib/system/timespan.cs,574ccdd4f806977f似乎在比較Ticks的符號位 – Slai