【问题标题】:When are two Datetime variables equal?两个日期时间变量何时相等?
【发布时间】:2010-12-27 21:51:27
【问题描述】:

我尝试使用 Datetime.CompareTo() 方法将 Datetime.Now 与我设置的 Datetime 变量进行比较。我使用计时器每秒比较这些并显示结果,但是随着当前时间接近我设置的时间,结果从 1 变为 -1,但从不为 0,这意味着这两个永远不相等。我怀疑 Datetime 结构包含毫秒?

【问题讨论】:

    标签: c# asp.net vb.net


    【解决方案1】:

    你猜对了。虽然它超过了毫秒。最大分辨率为"tick",等于 100 纳秒。

    【讨论】:

      【解决方案2】:

      正如其他人在这里提到的,分辨率是 100ns。

      最简单的方法是使用您的 DateTime 并减去 DateTime.Now。然后你会得到一个 TimeSpan。如果 TimeSpan 的 TotalSeconds 属性为 0,则它们之间的差异小于一秒。

      【讨论】:

      • TimeSpan.TotalSeconds 是双精度数,因此您应该检查
      • 另请注意,尽管 DateTime 结构精确到 100ns,但“Now”属性实际上仅精确到大约 1/64一秒。计时器的precision不需要反映它的accuracy
      • 这两个工具用于不同的事情。知道现在是什么时间不同于知道两个事件之间经过了多少纳秒。时钟的精度应与其准确度相称。您的计算机中没有原子钟;即使您将其同步到 time.gov,您的计算机时钟通常准确到小于 1/64 秒,因此更精确 比它准确
      • 性能不重要;这是硬件问题。您的计算机中没有时钟可以以纳秒的精度告诉您现在是什么时候。有一个时钟可以测量处理器循环了多少次,但除非你知道第一个循环发生在纳秒精度内的时间,否则它无法告诉你现在几点了
      • 现在,假设你确实有这样一个时钟,并且你得到了纳秒级的精度。 如果在将时间放入变量和读取变量之间存在线程切换怎么办? 在这种常见情况下,时钟只会告诉您它曾经是什么时间,而不是现在几点。纳秒级时钟无用,因为它的准确性取决于线程切换的频率。这并非巧合,大约是 1/64 秒。在多线程系统中,拥有比量子更精确的时钟没有任何意义。
      【解决方案3】:

      您的怀疑是正确的。 DateTime 结构的最小单位是"Tick",以 100ns 为单位测量。 (一个滴答是 100ns)

      您更可能想要做的是检查所有精确到秒的内容是否相等,您可以这样做,首先比较 Date 属性,然后分别比较小时、分钟和秒属性

      【讨论】:

        【解决方案4】:

        DateTime 比较比与秒比较更精确。在您的场景中,您可以定义一个“错误范围”,例如如果两个DateTime 之间的间隔小于 1 秒,则它们被认为是相同的(在您的程序中)。

        【讨论】:

          【解决方案5】:

          试试这个...(当然要更改测试日期)

                  DateTime d1 = new DateTime(2011, 12, 27, 4, 37, 17);
                  DateTime d2 = DateTime.Now;
          
                  if (d1.Subtract(d2).Seconds <= 1)
                  {
                      //consider these DateTimes equal... continue
                  }
          

          【讨论】:

          • 实际上,如果差值恰好是一分钟、一小时等,秒数将为 0。您将不得不使用 TotalSeconds。
          【解决方案6】:

          我更喜欢比较 Datetime(以及双精度)而不是精确值,而是值范围,因为您不太可能拥有精确值。

              DateTime d1  = new DateTime(2011, 12, 27, 4, 37, 17);
              DateTime d2  = DateTime.Now;
          
              if ((d2 >= d1) && (d2 <= d1.AddMinutes(1)))
                 ....
          

          【讨论】:

            【解决方案7】:
                'simulate comparison of two datetimes
                d1 = DateTime.Now
                Threading.Thread.Sleep(250)
                d2 = DateTime.Now
            
                'see if two dates are within a second of each other
                Dim ts As Double = ((d2 - d1).TotalSeconds)
                If ts < 1 Then
                    'equal
                    Debug.WriteLine("EQ " & ts.ToString("n4"))
                Else
                    Debug.WriteLine("neq " & ts.ToString("n4"))
                End If
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-24
              相关资源
              最近更新 更多