我试图理解为什么下面的函数不起作用。
public IEnumerable<LogFile> GetLogs(string directory, DateTime start, DateTime end)
{
DirectoryInfo di = new DirectoryInfo(directory);
return di.GetFiles("*debug.log").Where(f => f.LastWriteTime > start && f.LastWriteTime <= end).Select(f => new LogFile(f.FullName));
}
为什么第二次比较(f.LastWriteTime <= end)
省略了指定的结束日期?
第一个比较(f.LastWriteTime > start)
不包含指定的开始日期。
例如,如果我设置开始日期为1/4/2013,结束日期为1/8/2013,函数返回具有以下日期的文件:
1/4/2013,1/5/2013,1/6/2013,1/7/2013
将不包括1/8/2013,尽管在代码中使用了<=。
您正在处理日期&时间值,而不仅仅是日期值。
1/6/2013 4:30
不等于1/6/2013 12:00
,尽管日期相同。
您可以在每个DateTime
对象上使用Date
属性来获得时间始终为午夜的新DateTime
对象。
DateTime也包含(顾名思义)时间组件。所以你的比较实际上是:
f.LastWriteTime > start && f.LastWriteTime <= end
f.LastWriteTime > 1/4/2013 00:00:00 && f.LastWriteTime <= 1/8/2013 00:00:00
最后一个文件日期可能类似于1/8/2013 13:45:12所以
1/8/2013 13:45:12 <= 1/8/2013 00:00:00
是错误的。由于时间组件,第一个日期实际上包含在result:
中。1/4/2013 00:00:00 > 1/4/2013 13:45:12
是真的。
但是当与日期线时间比较时,value的最后一秒不包括:time <= 1/14/2013 1:26:42 am,它包括1/14/2013 1:26:41 am ?