如何在 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
个对象进行相等比较,因为影响结果的变量太多(时、分、秒、日、月、年、毫秒),只进行不等比较(<、<=、>、>=)。或者仅比较 DateTime
的 Date
部分,如下所示:
source = source.Where(o => o.TaskStartDate.Value.Date == dtStartDate.Date);
对于最常见的用法来说已经足够了。
我想以 (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
个对象进行相等比较,因为影响结果的变量太多(时、分、秒、日、月、年、毫秒),只进行不等比较(<、<=、>、>=)。或者仅比较 DateTime
的 Date
部分,如下所示:
source = source.Where(o => o.TaskStartDate.Value.Date == dtStartDate.Date);
对于最常见的用法来说已经足够了。