C# 检查添加TimeSpan是否超过TimeSpan.MaxValue

C# 检查添加TimeSpan是否超过TimeSpan.MaxValue,c#,.net,timespan,C#,.net,Timespan,我正在尝试添加一些时间跨度以进行一些计算。 例如: 在这种情况下,它将超过TimeSpan.MaxValue并引发异常 System.OverflowException:时间跨度溢出,因为持续时间太长 添加时间跨度的正确方法是什么 我是否必须对它进行尝试,或者编写自己的扩展方法?似乎这应该是.Net framework的一部分-默认为MaxValue或具有TryAdd方法。我最后为TimeSpan编写了一个扩展方法。还需要检查TimeSpan.MinValue,因为您可以添加负数。我开始检查滴答

我正在尝试添加一些时间跨度以进行一些计算。
例如:

在这种情况下,它将超过TimeSpan.MaxValue并引发异常

System.OverflowException:时间跨度溢出,因为持续时间太长

添加时间跨度的正确方法是什么


我是否必须对它进行尝试,或者编写自己的扩展方法?似乎这应该是.Net framework的一部分-默认为MaxValue或具有TryAdd方法。

我最后为TimeSpan编写了一个扩展方法。还需要检查TimeSpan.MinValue,因为您可以添加负数。我开始检查
滴答声
的时间跨度,但我得到了一些奇怪的结果。显然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;
}
publicstatictimespan AddTimeSpan(此TimeSpan第一个TimeSpan,TimeSpan第二个TimeSpan)
{
如果(firstTimeSpan.TotalMinutes+secondTimeSpan.TotalMinutes>TimeSpan.MaxValue.TotalMinutes)
{
返回TimeSpan.MaxValue;
}
如果(firstTimeSpan.TotalMinutes+secondTimeSpan.TotalMinutes
我会使用代数,并将所有内容保持在
时间跨度
单位内:

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;
}
publicstatictimespan AddTimeSpan(此TimeSpan ts1,TimeSpan ts2)
{
bool sign1=ts1ts2)
{
返回TimeSpan.MinValue;
}
}
如果(!sign1&&!sign2)
{
if(TimeSpan.MaxValue-ts1

这样,您就可以利用
TimeSpan
,而无需将其转换为其他单位,并且您可以放心,无论转换过程中可能出现的其他潜在问题如何,添加操作都会起作用(我认为可以安全地假设
TimeSpan
范围不会改变,以至于
TotalMinutes
不再足够,但是当您接近
TimeSpan.MinValue
TimeSpan.MaxValue
的限制时,您可能会在精确的加法结果中遇到一些不准确的情况。)你可以检查参考源,因为提示似乎是在比较TICKS的符号位,为什么你认为抛出异常不是正确的行为?考虑如果<代码> TimeSp33/Cuth>导致<代码> TimeSp.Max Value/Cult>,你将违反数学规则,使< <代码> TimeSp33-TimePAN1!meSpan2
@MattJohnson很好!但是,我的MaxValue用例是“无限”。因此,
infinity+infinity=infinity
。在这种情况下,我也不应该使用
infinity-timespan=…
,而依赖于结果。我最终切换回使用ticks。比较调用此方法300或400万次的时间跨度的性能影响太大了
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;
}