如何比较日期时间(仅DD / MM / YYYY HH:MM:SS TT在日期时间而不是整个FFF部

2019-09-27 16:02发布

我想比较这来自剑道过滤器(DD / MM / YYYY HH:MM:SS TT)日期时间格式,并希望与使用LINQ表达我的数据库进行比较。

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

这里dtStartDate来自剑道,我从剑道得到的日期是'10/11/2016 15:34:45'和我的数据库中的日期是'10/11/2016:15:34:45'但后来我也也有像错误'Enumeration yielded no results'我认为,必须把一大堆的日期与.fff节也,但我不明白,从剑道(即我不想得到它)。

这里的问题是,当我试图以compare both dates是相同的,但在比较系统相比, 'DD/MM/YYYY hh:mm:ss.fff tt'现在的问题是'.fff'由于这个日期是不比较并因此yielded no result

做任何有什么解决办法?

Answer 1:

这两个日期时间,如果你删除毫秒部分相同。

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

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


Answer 2:

当您执行相等比较,你是正确的,比较的完整表示DateTime ,说实话它比较平等Ticks各财产DateTime对象。

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

(来自参考源 )

如果你只需要日期(年,月,日)和时间的平等(小时,分,秒),您需要实现类似以下内容:

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的目的,因为存在其影响结果太多变量(小时,分,秒,星期,月,年,毫秒)和仅执行不等式比较(<,<=,>,> =)。 或只比较Date的分量DateTime如下:

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

这是经常足够的这种最常见的用法。



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