1

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

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

然而,这比我预期的要早一分钟评估为真。例如,如果我的运行时间为 9:30,它从 9:29 到 9:30 而不是 9:30 - 9:31 评估为真。我在这里想念什么?我理解代码的方式是,当运行时大于或等于 now 且小于 now 加一分钟时,它将评估为 true。

4

4 回答 4

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

让我们重写这个条件:

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

所以当是 9:30 时,从(9:29) 到(9:30) 包括在内RunTime,条件应该为真。就像你说的在你的帖子里。RunTime.AddMinutes(-1)RunTime

如果您在 9:30 到 9:31 期间该条件成立,那么您应该使用不同的条件:

now.ToUniversalTime() >= RunTime.ToUniversalTime() &&
now.ToUniversalTime() < RunTime.AddMinutes(1).ToUniversalTime()
于 2016-04-21T17:31:23.753 回答
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 变量并制作一些应该发生的逻辑表。您将更好地了解要创建的规则。

于 2016-04-21T17:11:42.390 回答
1

以下代码按预期工作(即它打印“第二个真”而不是“第一个真”):

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

因此,当您说“如果我的运行时间为 9:30,它从 9:29 到 9:30 而不是 9:30 - 9:31 的计算结果为真”时,我们必须假设您是错误的。

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

于 2016-04-21T17:19:56.023 回答
0

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

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

if (timeSpan > 0 && timeSpan <= 1)
{
   //Code here
}
于 2016-04-21T17:28:13.247 回答