【问题标题】:Code never reaching if(DateTime.Now == myTime) value代码永远不会达到 if(DateTime.Now == myTime) 值
【发布时间】:2013-12-18 14:54:10
【问题描述】:

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

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

所以我会打开几个浏览器会话,按下“异常”按钮,然后这段代码就会运行。一旦当前时间与我设置的时间匹配,那么它应该抛出异常,但 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;
            }
        }
    }
}

【问题讨论】:

  • 表达式DateTime.Now == run 不太可能评估为真,你不觉得吗?鉴于DateTime 精确到万分之一毫秒?
  • 换句话说 - 使用> 而不是==...
  • @CiaranGallagher 你没有设置毫秒,但DateTime.Now 设置了。想象一下比较 1.01.1 的两个双精度,并期望它们相等,因为您在第一个中设置了 .0
  • @CiaranGallagher:不,因为 DateTime.Now 精确到毫秒。是 1.12345 == 1.123456?
  • @CiaranGallagher - DateTime 基本上是一个穿着得体的 (U)Int64 从 0001-01-01 开始计算滴答声。如果您这样创建它,您未指定的所有时间部分将自动设置为零。

标签: c# asp.net .net datetime


【解决方案1】:

如果(日期时间。现在 >= 运行)

类似于用 float 或 double 检查相等性的陷阱

【讨论】:

  • 这正是我所需要的,不知何故我没想到:)
【解决方案2】:

我认为您只是没有考虑到时间永远不会四舍五入到秒的事实。总是有毫秒。如果要比较,就用这个sn-p

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

【讨论】:

    【解决方案3】:

    使用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();
    }
    

    【讨论】:

      【解决方案4】:

      试试这个 if 条件:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        • 2021-11-02
        • 2023-03-12
        • 1970-01-01
        相关资源
        最近更新 更多