比较C#中的DateTimes会产生意外结果

时间:2016-04-21 16:54:52

标签: c# datetime-comparison

我试图比较一个运行时变量是否在现在和一分钟之内。这是代码:

if (RunTime.ToUniversalTime() >= now.ToUniversalTime() && 
    RunTime.ToUniversalTime() < now.AddMinutes(1).ToUniversalTime())
{
    //Do Stuff 
}

然而,在我预期之前一分钟评估为真。例如,如果我的运行时间为9:30,则从9:29到9:30而不是9:30 - 9:31评估为真。我在这里失踪了什么?我理解代码的方式是,当运行时大于或等于现在且小于现在加上一分钟时,它将评估为true。

4 个答案:

答案 0 :(得分:3)

RunTime.ToUniversalTime() >= now.ToUniversalTime() && 
RunTime.ToUniversalTime() < now.AddMinutes(1).ToUniversalTime()

让我们改写这个条件:

now.ToUniversalTime() <= RunTime.ToUniversalTime() &&
now.ToUniversalTime() > RunTime.AddMinutes(-1).ToUniversalTime()

因此当RunTime为9:30时,条件应该从RunTime.AddMinutes(-1)(9:29)独占到RunTime(9:30)包含。就像你说它在你的帖子中一样。

如果您在9:30到9:31之间的条件是真的,那么您应该使用不同的条件:

now.ToUniversalTime() >= RunTime.ToUniversalTime() &&
now.ToUniversalTime() < RunTime.AddMinutes(1).ToUniversalTime()

答案 1 :(得分:2)

由于您正在使用DateTime.Now,因此您永远不会在同一时间准确降落。考虑这两种情况:

Case 1 (what you're experiencing)
now:     9:29:01
runtime: 9:30:00
now+1:   9:30:01

Case 2 (what you want but doesn't work)
now:     9:30:01
runtime: 9:30:00
now+1:   9:31:01

尝试显式设置now变量,并制作一些应该发生的逻辑表。您将更好地了解要创建的规则。

答案 2 :(得分:1)

以下代码按预期工作(即打印&#34;第二个真实&#34;而不是&#34;第一个真实&#34;):

DateTime nine29  = new DateTime(2015, 01, 01, 09, 29, 00);
DateTime nine30  = new DateTime(2015, 01, 01, 09, 30, 00);
DateTime runtime = nine30;

if (runtime.ToUniversalTime() >= nine29.ToUniversalTime() && runtime.ToUniversalTime() < nine29.AddMinutes(1).ToUniversalTime())
    Console.WriteLine("First true");

if (runtime.ToUniversalTime() >= nine30.ToUniversalTime() && runtime.ToUniversalTime() < nine30.AddMinutes(1).ToUniversalTime())
    Console.WriteLine("Second true");

因此,当你说&#34时,我们必须假设你错了;如果我的运行时间为9:30,则从9:29到9:30而不是9:30 - 9:31评估为真&#34;

将所有时间放入变量并将其打印到调试窗口或控制台,或在调试器下运行并检查它们。并注意秒!

答案 3 :(得分:0)

我喜欢在进行日期时间比较时使用TimeSpan类型。

TimeSpan timeSpan = Runtime.ToUniversalTime().Subtract(now.ToUniversalTime());

if (timeSpan > 0 && timeSpan <= 1)
{
   //Code here
}