代码永远不会达到if(DateTime.Now == myTime)值

时间:2013-12-18 14:54:10

标签: c# asp.net .net datetime

我有一个简单的(愚蠢的)代码,我用它来测试我们的错误记录机制。它试图从不存在的文件中读取。例外,我设置了DateTime值,然后我有一个while循环。一旦当前DateTime等于我设置的DateTime值,那么我将异常传递给我的错误记录项目。

此代码在按下按钮时开始。这样做的目的是我可以测试在ASP.NET应用程序中从单独的用户会话中抛出多个异常时会发生什么。

所以我打开几个浏览器会话,按'Exception'按钮然后这个代码就会运行。一旦当前时间与我设置的时间匹配,那么它抛出异常,但if(DateTime.Now == run)永远不会评估为真。为什么?

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {
        string text = System.IO.File.ReadAllText(@"C:\test.txt");
    }
    catch (FileNotFoundException ex)
    { 
        DateTime run = new DateTime(2013, 12, 18, 14, 0, 0);
        bool hasRun = false;

        while (hasRun == false)
        {
            if (DateTime.Now == run)
            {
                ErrorLogger errorLogger = new ErrorLogger(ex);
                hasRun = true;
            }
        }
    }
}

4 个答案:

答案 0 :(得分:1)

if(DateTime.Now> = run)

与使用float或double检查相等性时类似的陷阱

答案 1 :(得分:1)

我认为你只是没有考虑到时间永远不会四舍五入到秒。总有几秒钟。如果您想比较,只需使用此代码段

var date = DateTime.Now;
date = new DateTime(date.Year,date.Month,date.Day,date.Hour,date.Minute,date.Second)
if (date == run)
{ 

答案 2 :(得分:1)

使用Timer可以获得更清晰,风险更低的代码(没有可能无限的循环):

catch(FileNotFoundException ex)
{
    // The hard-coded date should of course be a *future* one for the code to have sense
    var interval = new DateTime(2013, 12, 20, 09, 00, 00) - DateTime.Now;

    Timer t = new Timer(interval.TotalMilliseconds);
    t.Elapsed += (s, e) =>
    {
        ErrorLogger errorLogger = new ErrorLogger(ex);
        t.Stop(); // Let it only run once
    };
    t.Start();
}

答案 3 :(得分:0)

尝试使用if条件:

if (Datetime.Now.Subtract(run).Days == 0)
{
    // code goes here if the run and Datetime.Now are on the same day
}