在 C# 中比较 DateTimes 产生意想不到的结果

Comparing DateTimes in C# producing unexpected results

我正在尝试比较运行时变量是在现在还是一分钟后。这是代码:

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

然而,这比我预期的要早一分钟评估为真。例如,如果我的运行时间为 9:30,它从 9:29 到 9:30 的计算结果为真,而不是 9:30 - 9:31。我在这里错过了什么?我对代码的理解是,当运行时间大于或等于现在且小于现在加一分钟时,它的计算结果为真。

由于您使用的是 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 变量,并制作一些应该发生的逻辑表。您将更好地了解要创建的规则。

以下代码按预期工作(即打印 "Second true" 而不是 "First true"):

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");

因此,当您说 "if I have my runtime as 9:30 it evaluates to true from 9:29 to 9:30 not 9:30 - 9:31."

时,我们必须假设您错了

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

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

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

if (timeSpan > 0 && timeSpan <= 1)
{
   //Code here
}
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) 包含.就像你说的在你的 post.

如果您从 9:30 到 9:31 的条件为真,那么您应该使用不同的条件:

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