【问题标题】:DateTime comparison not including the most recent dateDateTime 比较不包括最近的日期
【发布时间】: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 &lt;= end)省略了指定的结束日期?

第一次比较(f.LastWriteTime &gt; start) 确实包含指定的开始日期。

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

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

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

【问题讨论】:

  • 如果您想包含整个结束日期,您可以添加一天,然后使用Date 属性(午夜):&lt; 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


【解决方案1】:

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

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

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

【讨论】:

  • 是的!似乎可以解决问题。现在让我的代码如下:'f.LastWriteTime.Date >= start.Date && f.LastWriteTime.Date
  • Servy 是对的,如果没有为 DateTime 对象指定时间,则假定为午夜,这被认为是一天的开始而不是结束。为了使您的代码按预期运行,您需要将 end 的时间部分设置为 23:59:59 或完全忽略时间。
  • @Kevin 即使这样,时间的精度也小于一秒,因此更容易说小于第二天的午夜以避免此类问题。不过,就可读性而言,如果您只关心日期,我会花时间在所有相关日期致电.Date;对读者来说更清楚。
  • @Servy 同意,但我不想尝试讨论如何计算日期的最后一个刻度值。但是您是正确的,使用我的建议仍然会错过在日期的最后一秒创建的任何文件。完全忽略时间(这是比较建议中的日期部分所做的)确实是最准确和包容的方法。
  • 不关心文件的确切时间。只需要在指定日期之间(包括指定日期)修改所有文件。
【解决方案2】:

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

是真的。

【讨论】:

    【解决方案3】:

    但是当与日期 plue 时间比较时,不包括最后一秒的值:时间

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 2021-01-19
      • 2016-03-28
      相关资源
      最近更新 更多