4

我试图了解为什么以下功能不起作用。

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)确实包括指定的开始日期。

例如,如果我将开始日期设置为 2013 年 1 月 4 日,将结束日期设置为 2013 年 1 月 8 日,则函数返回具有以下日期的文件:

2013 年 1 月 4 日、2013 年 1 月 5 日、2013 年 1 月 6 日、2013 年 1 月 7 日

尽管在代码中使用了 <=,但它不包括 2013 年 1 月 8 日。

4

3 回答 3

9

您正在处理日期和时间值,而不仅仅是日期值。

1/6/2013 4:30不等于1/6/2013 12:00,尽管日期相同。

您可以使用Date每个对象的属性来获取时间始终为午夜的DateTime新对象。DateTime

于 2013-01-10T20:51:43.080 回答
4

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

是假的。由于时间分量,结果中包含第一个日期:

1/4/2013 00:00:00 > 1/4/2013 13:45:12

是真的。

于 2013-01-10T20:56:03.130 回答
0

但是当与日期时间比较时,不包括最后一秒的值:时间 <= 1/14/2013 1:26:42 am,它包括 1/14/2013 1:26:41 AM ?

于 2013-01-28T15:56:39.490 回答