获取添加或减去的值会导致无法表示的DateTime异常

时间:2017-07-12 23:17:43

标签: c# do-while

这是我的代码的一部分:

DateTime answer;

DateTime today = DateTime.Today;
    do {

        if (years / planetyeardata[0] > 1)
        {


            answer = today.AddDays(87.97 * (1 - (days / 87.97 - (days / 87.97))));
            mnbd.Text = answer.ToString();
            today = answer;
        }
        else
        {

            answer = today.AddDays(87.97 * (1 - days / 87.97));    // + (224.7 * (1 - days / 224.7) * 24 * 3600 * 1000));

            today = answer;
            mnbd.Text = answer.ToString();

        }
    } while (today <= answer);

如果我没有围绕if语句执行do-while语句,那么可以解决一些代码问题&#34;回答&#34;工作正常。但是,当我得到这个错误的时候。

我基本上想继续执行&#34;回答&#34;直到它的值高于当前日期。

2 个答案:

答案 0 :(得分:0)

所以这里对你的代码进行了一些分析。

简而言之 - 您的执行列表永远不会结束循环,除了一种情况外,您还可以达到最小或最大DateTime值,然后您将获得异常。< / p>

长版本 - 您的执行列表包含2个部分 - 一个在if中,一个在else块中。由于条件为years / planetyeardata[0] > 1,并且循环中的任何内容都不会更改yearsplanetyeardata,因此可以将此条件视为常量。基本上,你的do-while循环将始终转到if阻止或始终转到else阻止。

如果它正在输入if块,则表达式answer = today.AddDays(87.97 * (1 - (days / 87.97 - (days / 87.97))));将始终为answer = today.AddDays(87.97),原因是(days / 87.97 - (days / 87.97))始终为0.紧接着,您正在设置today = answer。由于您始终将today设置为等于answer,因此您永远不会违反while (today <= answer)条件。另一方面,您的日期总是会增加87.97天,并且会在某个时间大于DateTime.MaxValue,这会引发异常。

如果它输入else块,则表达式为answer = today.AddDays(87.97 * (1 - days / 87.97));。根据{{​​1}}值,您有3种可能的结果:

  1. days - 在这种情况下days < 87.97将始终大于零,因为您的日期会逐渐增加,直到您到达(1 - days / 87.97)会引发异常
  2. DateTime.MaxValue - 在这种情况下,days == 87.97将始终等于零,因为您的日期永远不会改变,永远不会离开do-while块
  3. (1 - days / 87.97) - 在这种情况下,days > 87.97将始终小于零,因为您的日期将逐渐减少,直到您到达(1 - days / 87.97)将引发异常
  4. 由于您在设置DateTime.MinValue后立即执行,因此您永远不会中断today = answer条件,并且您的循环将永远不会停止,直到您获得异常。

    因此,通常情况下,您的while (today <= answer)条件始终会得到满足,并且块内的代码将始终超出可用while值的范围,并带有一个可能的结果(DateTime位于{{ 1}}阻止)你的日期总是保持不变,永远不会离开do-while块。

答案 1 :(得分:0)

DateTime Structure的最小值为1/1/0001,最大值为12/31/9999

循环中的代码尝试添加使today超出此范围的天数。

您可以检查溢出并相应地处理异常:

DateTime answer;
DateTime today = DateTime.Today;
do
{

    if (years / planetyeardata[0] > 1)
    {



        var daysToAdd = (1 - (days / 87.97 - (days / 87.97)));
        if (daysToAdd > 0 && DateTime.MaxValue.Subtract(today).TotalDays > daysToAdd)
            throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));
        if (daysToAdd < 0 && today.Subtract(DateTime.MinValue).TotalDays > daysToAdd)
            throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));

        answer = today.AddDays(87.97 *daysToAdd );
        mnbd.Text = answer.ToString();
        today = answer;
    }
    else
    {
        var daysToAdd = (1 - (days / 87.97 - (days / 87.97)));
        if (daysToAdd > 0 && DateTime.MaxValue.Subtract(today).TotalDays > daysToAdd)
            throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));
        if (daysToAdd < 0 && today.Subtract(DateTime.MinValue).TotalDays> daysToAdd)
            throw new Exception(string.Format("Can't add {0} days to {1}", daysToAdd, today));

        answer = today.AddDays(87.97 * (1 - days / 87.97));    // + (224.7 * (1 - days / 224.7) * 24 * 3600 * 1000));

        today = answer;
        mnbd.Text = answer.ToString();

    }
} while (today <= answer);