【发布时间】:2014-01-30 17:42:21
【问题描述】:
我试图了解为什么以下功能不起作用。
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 日,尽管在代码中使用了
【问题讨论】:
-
如果您想包含整个结束日期,您可以添加一天,然后使用
Date属性(午夜):< end.AddDays(1).Date) -
顺便说一句,如果您使用的是 .NET 4.0+,您可能希望使用 EnumerateFiles 而不是使用 GetFiles
-
@TimSchmelter 这就是我最初的工作。它似乎工作得很好,但我更好奇为什么它没有按预期工作。我认为我的逻辑是正确的,但我最终通过使用 DateTime 对象的 Date 属性来修复它。所以我的比较语句现在看起来像:f.LastWriteTime.Date >= start.Date && f.LastWriteTime.Date
-
但结果不同。现在您从结果中排除结束日期。如果您先添加一天并在包含结束日之后使用
Date属性。 -
@TimSchmelter 似乎可以正确提取文件。我不关心文件的时间。只是日期。我只需要在这些日期之间(包括这些日期)修改的任何文件。因此,如果我将 1/4/2013 指定为 1/8/2013,我只关心在 2013 年 1 月 8 日修改的任何文件,无论其修改时间如何。
标签: c# datetime comparison