如何在 linq C# 中比较日期时间(只有 dd/mm/yyyy hh:mm:ss tt 而不是日期时间中的整个 fff 部分)?

How to compare datetime (only dd/mm/yyyy hh:mm:ss tt not whole fff section in datetime) in linq C#?

我想以 (DD/MM/YYYY hh:mm:ss tt) 格式比较来自 kendo 过滤器的日期时间,并想使用 linq 表达式与我的数据库进行比较。

IEnumerable<ValidateTaskSummaryDetails> source;
source = source.Where(o => o.TaskStartDate.Value == dtStartDate);

这里 dtStartDate 来自 Kendo,我从 kendo 得到的日期是 '10/11/2016 15:34:45' 而我数据库中的日期是 '10/11/2016:15:34:45' 但是然后我也有像 'Enumeration yielded no results' 这样的错误,我认为它也必须用 .fff 部分占用整个日期,但我没有从 kendo 得到它(即我不想要为拿到它,为实现它)。

这里的问题是当我尝试 compare both dates 时,它们是相同的, 但是在与 'DD/MM/YYYY hh:mm:ss.fff tt' 相比的比较系统中,现在问题出在 '.fff' 上,因为没有比较这个日期,因此 yielded no result.

有什么解决办法吗?

both DateTime are same if you remove the millisecond portion.

如果是这样,您可以截断 TaskStartDate.Value 的毫秒部分;

source = source.Where(o => 
                      o.TaskStartDate.Value.AddTicks(-(o.TaskStartDate.Value.Ticks % TimeSpan.TicksPerSecond)) 
                      == dtStartDate);

当你进行相等比较时,你是对的,比较 DateTime 的完整表示,说实话它比较每个 DateTime Ticks 属性 的相等性] 对象。

public static bool operator ==(DateTime d1, DateTime d2) {
    return d1.InternalTicks == d2.InternalTicks;
}

(来自 reference source

如果您只需要日期(年、月、日)和时间(时、分、秒)相等,则需要实现如下内容:

IEnumerable<ValidateTaskSummaryDetails> source;
source = source.Where(o => o.TaskStartDate.Value.Year == dtStartDate.Year && 
                        o.TaskStartDate.Value.Month == dtStartDate.Month && 
                        o.TaskStartDate.Value.Day == dtStartDate.Day &&
                        o.TaskStartDate.Value.Hour == dtStartDate.Hour &&
                        o.TaskStartDate.Value.Minute == dtStartDate.Minute &&
                        o.TaskStartDate.Value.Second == dtStartDate.Second);

或者比较所需格式的字符串表示是否相等。

var format = "dd/MM/yyyy HH:mm:ss";
source = source.Where(o => o.TaskStartDate.Value.ToString(format) == dtStartDate.ToString(format));

第一种方法会更快,因为它需要比较数字字段而不是 string。应该注意(正如评论中指出的那样)将 DateTime 转换为字符串并比较它的字符串表示是一种坏主意,它是难闻代码的好例子。它会给出所需的结果,但你应该避免它 - 字符串比较总是比数字比较差。

建议避免对DateTime个对象进行相等比较,因为影响结果的变量太多(时、分、秒、日、月、年、毫秒),只进行不等比较(<、<=、>、>=)。或者仅比较 DateTimeDate 部分,如下所示:

source = source.Where(o => o.TaskStartDate.Value.Date == dtStartDate.Date);

对于最常见的用法来说已经足够了。