【问题标题】:Create an array or List of all dates between two dates [duplicate]创建两个日期之间所有日期的数组或列表[重复]
【发布时间】:2010-09-17 20:22:11
【问题描述】:

我正在生成多系列图表,其中日期沿 X 轴。

问题在于,并非图表中的所有系列在日期范围内都具有相同的日期。这意味着如果我选择 2 月 1 日至 4 月 30 日,则一个系列的数据可能从 2 月 1 日开始,但仅持续到 3 月底,但另一个系列可能具有整个日期范围的数据。

这会扭曲我需要创建的图表。去吧,考虑到在查询开始时采用的日期范围,我想生成一个日期列表并填充要绘制的数据,对于那些没有数据的日期,用 0 填充这些系列。

【问题讨论】:

    标签: c# asp.net list


    【解决方案1】:

    LINQ:

    Enumerable.Range(0, 1 + end.Subtract(start).Days)
              .Select(offset => start.AddDays(offset))
              .ToArray(); 
    

    For循环:

    var dates = new List<DateTime>();
    
    for (var dt = start; dt <= end; dt = dt.AddDays(1))
    {
       dates.Add(dt);
    }
    

    编辑: 至于在时间序列中使用默认值填充值,您可以枚举整个日期范围内的所有日期,并直接从序列中选择日期值(如果存在),否则选择默认值。例如:

    var paddedSeries = fullDates.ToDictionary(date => date, date => timeSeries.ContainsDate(date) 
                                                   ? timeSeries[date] : defaultValue);
    

    【讨论】:

    • 如果您想要一个持续 5 天的范围,例如 4/9 - 4/13,对 Enumerable.Range 的调用将创建一个集合 {0,1,2,3,4} . select 语句获取该集合,并为每个元素将该值添加到开始日期并返回新日期。 #4/9/2012#.AddDays(0) = 4/9/2012, #4/9/2012#.AddDays(1) = 4/10/2012, #4/9/2012#.AddDays(2) = 4/11/2012,依此类推,从而生成日期范围。
    • 你应该使用TotalDays而不是Days
    • @yellowblood:为什么?不需要小数天数。
    • 抱歉,误读。正确撤消编辑。
    • 我真的很喜欢这个 for 循环。在DateTime 上看到循环并不是每天都有。
    【解决方案2】:
    public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate)
    {
        if (endDate < startDate)
            throw new ArgumentException("endDate must be greater than or equal to startDate");
    
        while (startDate <= endDate)
        {
            yield return startDate;
            startDate = startDate.AddDays(1);
        }
    }
    

    【讨论】:

    • 如果只想比较Date部分,修改while条件:while (startDate.Date
    • 由于循环应该在等于结束日期时结束,因为我们需要两个开始和结束之间的日期,所以结束日期不应该包括但条件
    • 看了下面的解释还是不明白你为什么要使用yield...stackoverflow.com/questions/39476/…
    【解决方案3】:

    我知道这是一篇旧帖子,但请尝试使用扩展方法:

        public static IEnumerable<DateTime> Range(this DateTime startDate, DateTime endDate)
        {
            return Enumerable.Range(0, (endDate - startDate).Days + 1).Select(d => startDate.AddDays(d));
        }
    

    并像这样使用它

        var dates = new DateTime(2000, 1, 1).Range(new DateTime(2000, 1, 31));
    

    您可以随意选择自己的日期,不必将自己限制在 2000 年 1 月。

    【讨论】:

      【解决方案4】:

      我们的常驻大师 Jon Skeet 有一个很棒的 Range Class,可以为 DateTimes 和其他类型执行此操作。

      【讨论】:

        【解决方案5】:
        list = list.Where(s => s.startDate >= Input_startDate && s.endDate <= Input_endDate);
        

         

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-01-05
          • 2013-07-05
          • 1970-01-01
          • 2011-11-08
          • 1970-01-01
          相关资源
          最近更新 更多