检查添加的 TimeSpans 是否超过 TimeSpan.MaxValue
Check if adding TimeSpans exceeds TimeSpan.MaxValue
我正在尝试将一些 TimeSpans 加在一起进行一些计算。
例如:
var timeSpan1 = new TimeSpan.FromMinutes(1);
var timeSpan2 = new TimeSpan.MaxValue;
var timeSpan3 = timeSpan1 + timeSpan2;
在这种情况下它会超过TimeSpan.MaxValue并抛出异常
System.OverflowException : TimeSpan overflowed because the duration is too long.
添加时间跨度的正确方法是什么?
我是否必须围绕它放置一个 try-catch 或编写我自己的扩展方法?似乎这应该是 .Net 框架的一部分 - 默认为 MaxValue 或具有 TryAdd 方法。
我最终为 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;
}
我会使用代数,并将所有内容保持在 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.MinValue
或 TimeSpan.MaxValue
) 的限制。
我正在尝试将一些 TimeSpans 加在一起进行一些计算。
例如:
var timeSpan1 = new TimeSpan.FromMinutes(1);
var timeSpan2 = new TimeSpan.MaxValue;
var timeSpan3 = timeSpan1 + timeSpan2;
在这种情况下它会超过TimeSpan.MaxValue并抛出异常
System.OverflowException : TimeSpan overflowed because the duration is too long.
添加时间跨度的正确方法是什么?
我是否必须围绕它放置一个 try-catch 或编写我自己的扩展方法?似乎这应该是 .Net 框架的一部分 - 默认为 MaxValue 或具有 TryAdd 方法。
我最终为 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;
}
我会使用代数,并将所有内容保持在 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.MinValue
或 TimeSpan.MaxValue
) 的限制。