【问题标题】:Simple way to get days given start and end dates获取给定开始和结束日期的日期的简单方法
【发布时间】:2013-01-14 15:26:01
【问题描述】:

有没有一种快速简单的方法来获取给定的开始和结束日期List<DateTime>

我显然知道我可以通过循环来实现这一点,但我想知道是否有使用 Linq 或其他实用程序的更智能的方法。

注意我需要在两个给定日期之间为每一天获取一个DateTime 实例。

【问题讨论】:

  • 您想将两个日期放在一个列表中...? new List<DateTime>{ dateTime1, dateTime2 };
  • 您在寻找什么样的粒度?
  • @MrLister 我每天需要一个DateTime

标签: c# .net linq datetime


【解决方案1】:

迭代器块非常适合。

我认为没有理由不在这里使用for 循环。您需要为每个日期执行一些运算符,因为您有这么多的输出,没有任何方法会具有更好的渐近复杂度。

public static IEnumerable<DateTime> GetDates(DateTime startDate, DateTime endDate
    , TimeSpan interval)
{
    for (DateTime date = startDate; date < endDate; date.Add(interval))
    {
        yield return date;
    }
}

您也可以为固定间隔添加重载:

public static IEnumerable<DateTime> GetDays(DateTime startDate, DateTime endDate)
{
    return GetDates(startDate, endDate, TimeSpan.FromDays(1));
}

【讨论】:

    【解决方案2】:

    您可以这样做以获取从startDateendDate 的列表:

    List<DateTime> dates =
      Enumerable.Range(0, (int)((endDate - startDate).TotalDays) + 1)
      .Select(n => startDate.AddDays(n))
      .ToList();
    

    【讨论】:

    • 这假定间隔是整数天,而不是 12 小时、3 分钟或 3.5 天等。
    • @Servy:是的,完全按照问题中的说明。
    • 他在编辑中补充说;在它没有指定一天的间隔之前。
    • @Servy:是的,这是在我写答案之前添加的。
    【解决方案3】:

    假设您需要每日粒度,并包括开始日期和结束日期:

    var start = new DateTime(2012, 01, 01);
    var end = new DateTime(2013, 01, 01);
    var daysInBetween = Enumerable.Range(0, (int) (end - start).TotalDays + 1)
                                  .Select(value => start.AddDays(value));
    

    【讨论】:

      【解决方案4】:

      惰性求值查询可能如下所示:

      //inclusive start and inclusive end
      public IEnumerable<DateTime> DateSequence(DateTime start, TimeSpan interval, DateTime end)
      {
          DateTime current = start;
          while(current <= end)
          {
              yield return current;
              current = current.Add(interval);
          }
      }
      

      现在您可以像下面这样简单地使用它。每天设置间隔为TimeSpan.FromDays(1)

      var start = DateTime.Now;
      var end = DateTime.Now.AddDays(7);
      var interval = TimeSpan.FromDays(1);
      
      var sequence = DateSequence(start, interval, end);
      
      //LinqPad specific call
      sequence.Dump();
      

      打印:

      1/14/2013 5:34:57 PM 
      1/15/2013 5:34:57 PM 
      1/16/2013 5:34:57 PM 
      1/17/2013 5:34:57 PM 
      1/18/2013 5:34:57 PM 
      1/19/2013 5:34:57 PM 
      1/20/2013 5:34:57 PM 
      

      【讨论】:

        猜你喜欢
        • 2016-10-19
        • 1970-01-01
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多