为什么datetime不能比较?

我的C#unit testing有以下说法:

Assert.AreEqual(logoutTime, log.First().Timestamp); 

以下信息为何失败:

 Assert.AreEqual failed. Expected:<4/28/2010 2:30:37 PM>. Actual:<4/28/2010 2:30:37 PM>. 

他们不一样吗?

更新:

如果你只关心第二个,请使用这个:

Assert.AreEqual(logoutTime.ToString(), log.First().Timestamp.ToString());

你有没有证实蜱/毫秒数是相等的?

如果你连续两次执行DateTime.Now() ,它们看起来是同一个数字,甚至到第二个 ,但是它们通常会因滴答而变化。 如果你只想检查一分钟的平等,只比较每个DateTime到那个程度。 有关舍入date时间的信息,请参阅此处


关于解决scheme的说明 :

Now属性经常用于衡量性能。 但由于其分辨率较低,不适合用作对标工具。 更好的select是使用秒表类。

Assert失败方法可能是在DateTime上调用ToString() ,该方法返回一个不含毫秒组件的截断的,人类可读的dateforms。 这就是为什么当DateTime对象的精度为100纳秒单位(称为Tick )时,它们看起来是相等的。 这意味着极不可能有两个DateTime对象具有完全相同的值。 为了比较你可能想要截断的价值,也许通过格式化date为您所需要的保真度。

你确定logoutTime和log.First()。Timestamp都被input为DateTime吗?

如果是这样,那么对于更具体的时间信息(例如,毫秒),它们也可能具有不同的值。

使用entity framework,如果使用.AsNoTracking()从数据库中获取数据,则DateTime属性将四舍五入,但如果原始值仍在内存中,则不一定会使用.AsNoTracking()四舍五入。 因此,对于涉及数据库往返的集成testing,我想最好使用.ToString()因为数据库会稍微降低精度。

尝试像Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)

假设logoutTime和log.First().Timestamp都是DateTimetypes,你应该尝试使用它来代替:

 Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks); 

我想Assert.AreEqual<T>使用Object.Equals()来确定对象的平等,但不是值。

可能这个陈述是比较两个不同的对象 ,因此返回false。