我是C#的新手,我正在尝试编写一个简单的控制台应用程序。我有两个日期时间但我无法收到消息Same
,它会一直打印Different
。
我还在控制台中打印两个日期时间以了解它们是否不同,但即使系统时间相同也不满足条件。
static void Main(string[] args)
{
while (true)
{
Thread.Sleep(1000);
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Parse("06:30:00 AM");
if (TimeSpan.Compare(dt1.TimeOfDay, dt2.TimeOfDay) == 0)
{
Console.WriteLine("Same");
}
else
{
Console.WriteLine("Different");
}
Console.WriteLine(dt1);
Console.WriteLine(dt2);
}
}
答案 0 :(得分:5)
DateTime
的分辨率低至刻度,即使默认情况下它们在大多数文化中仅打印秒。
如果您为dt1.ToString("o")
打印dt2
和相同,您会看到即使它们等于第二个,它们也可能会以亚秒级数量变化。这就解释了为什么您当前的代码可以打印“不同”,但仍然会为接下来的两行打印相同的值。
答案 1 :(得分:2)
DateTime
比秒更精确,它基于刻度,每个刻度为100纳秒。因此,即使DateTime.Now
在几小时和几秒钟内匹配,它也会以小时为单位。
当您尝试比较时,最好使用>
或<
。或者做(a - b) < some timespan
!类似的东西:
DateTime dt1 = DateTime.Now;
DateTime dt2 = DateTime.Parse("06:30:00 AM");
bool matches = ( dt2 - dt1 ).Duration() < TimeSpan.FromMilliseconds( 100 ); // matches if dt1 and dt2 are within 0.1s
需要.Duration()
调用以获得不能为负的绝对时间跨度。请注意,您不应该将此方法用于类似警报的事情,您的系统可能会暂时冻结(由于多种可能性)并且您会错过它。
答案 2 :(得分:1)
您当前的比较会比较两个DateTime
对象的Ticks。如果你想比较小时,分钟和秒,那么请检查如下:
if (dt1.TimeOfDay.Hours == dt2.TimeOfDay.Hours &&
dt1.TimeOfDay.Minutes == dt2.TimeOfDay.Minutes &&
dt1.TimeOfDay.Seconds == dt2.TimeOfDay.Seconds)