在 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()
我正在尝试比较运行时变量是在现在还是一分钟后。这是代码:
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()