C# 比较相等的日期时间返回false

C# 比较相等的日期时间返回false,c#,datetime,C#,Datetime,我有一个关于如何在C#中比较/存储日期时间的查询。考虑下面的代码: var createdDate = DateTime.Now; using (cr = new LanguageDictionaryRepository(ds)) { cr.Add(new Sybrin10.Data.DTO.LanguageDictionary() { Active = true, CreatedDate = createdDate, CultureCod

我有一个关于如何在C#中比较/存储日期时间的查询。考虑下面的代码:

var createdDate = DateTime.Now;
using (cr = new LanguageDictionaryRepository(ds)) {
    cr.Add(new Sybrin10.Data.DTO.LanguageDictionary() {
        Active = true,
        CreatedDate = createdDate,
        CultureCode = cultureCode,
        Data = new System.Text.UTF8Encoding().GetBytes("Test")
    });
    cr.Save();

    var y = cr.FindBy(x => x.CultureCode == cultureCode && x.CreatedDate == createdDate).FirstOrDefault();
    Assert.IsNotNull(y);
由于日期时间检查,
Assert.IsNotNull
失败。我希望,由于LanguageDictionary实例是使用变量的值创建的,所以这两个变量的值是相等的。这是使用Telerik.OpenAccess和MSSQL作为数据库层,所以我假设问题就在这里。有谁能告诉我,我是否有什么遗漏,以及如何正确比较这些值


编辑:勾号值不同,但我不知道为什么,因为它们都来自同一个变量,我只分配了一次。

我认为最好使用DateTime.UtcNow来存储数据,这样就不必担心夏令时问题等。以后可以使用您选择的区域性。

尝试使用
DateTime.Equals(x.CreatedDate,CreatedDate)
,可能会有所帮助

除此之外,适当的日期时间比较是一个非常复杂的问题,包括时区、偏移量、utc、本地时间等等。如果在两个看似相同的日期之间进行简单的比较以返回false,我一点也不会感到惊讶

如果
Ticks
值在写入和读取时不同,则可能会遇到
DateTimeKind
问题,即向数据库写入
DateTimeKind.Local
,但返回的是
DateTimeKind.Unspecified

另一个选项可能是(如果差异足够小),数据库中的
DateTime
字段不足以存储与.net
DateTime
相同的毫秒数:

一个滴答声代表一百纳秒或一千万分之一秒。一毫秒内有10000个滴答声

根据您的数据存储情况,可能不会像下面这样详细。您的
DateTime
值不是来自同一个源,一个是从内存读取的,另一个是从数据库读取的。

SqlServer以(大约)3毫秒的增量存储数据

日期时间值四舍五入为.000、.003或.007秒的增量

因此,通过数据库的日期时间往返可能会中断几毫秒

所以你不应该测试“完全相等”,而是测试“足够接近”

var y=cr.FindBy(x=>x.CultureCode==CultureCode&&
x、 CreatedDate>=CreatedDate.addMillimes(-5)和

x、 CreatedDate您确定日期相同吗?比较将考虑小时/分钟/秒/毫秒。就是这样,刻度值不同,但我不确定原因,因为它们都来自同一个变量CreatedDate。抱歉,意外删除了我的注释:/ticks刻度有多大差异?这是一个常量差异吗117,x.CreatedDate更大。我更新了我的答案,基本上,
117
差异什么都不是,因为一个刻度是一千万分之一秒。在这种情况下,比较日期的字符串表示形式是有效的选项吗?如果你只想找回你创建的记录,请参阅Teleriks。它会在后面读回创建的主键呃,省钱。事实上,我会为DateTime类创建一个扩展来进行比较,不会出现滴答声。谢谢你的回答,这让我非常清楚。我不知道这一点,谢谢你指出这一点,我会投票,但你的代码示例在现实中不是很实用。现在如果你把它作为一个扩展,我们现在谈论的是你可以n如果要查找较短的符号,请使用
(x.CreatedDate-CreatedDate).millizes<4
。@DdW-您需要在其周围添加
Math.Abs
,因为您可以从该比较中得到负值(当然总是负值)
var y = cr.FindBy(x => x.CultureCode == cultureCode && 
                    x.CreatedDate >= createdDate.AddMilliseconds(-5) && 
                    x.CreatedDate <= createdDate.AddMilliseconds(5))
     .FirstOrDefault();