我正在尝试将一些TimeSpans添加到一起进行一些计算 例如:
var timeSpan1 = new TimeSpan.FromMinutes(1);
var timeSpan2 = new TimeSpan.MaxValue;
var timeSpan3 = timeSpan1 + timeSpan2;
在这种情况下,它将超过TimeSpan.MaxValue并抛出异常
System.OverflowException:TimeSpan溢出,因为持续时间太长。
添加TimeSpans的正确方法是什么?
我是否必须在其周围放置try-catch或编写我自己的扩展方法?看起来这应该是.Net框架的一部分 - 默认为MaxValue或者使用TryAdd方法。
答案 0 :(得分: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
而无需将其转换为其他单元,并且您确信无论转换过程中可能出现的其他潜在陷阱(无论如何都是&#? 39;可以安全地假设TimeSpan
范围不会改变,TotalMinutes
不再足够,但是当你得到精确的加法结果时,你可能会遇到一些不准确的错误接近TimeSpan.MinValue
或TimeSpan.MaxValue
)的限制。
答案 1 :(得分: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;
}