创建两个日期之间的所有日期的数组或列表

And*_*ans 133 c# asp.net list

我正在生成带有沿X轴的日期的多系列图.

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

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

Ani*_*Ani 302

LINQ:

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

对于循环:

var dates = new List<DateTime>();

for (var dt = start; dt <= end; dt = dt.AddDays(1))
{
   dates.Add(dt);
}
Run Code Online (Sandbox Code Playgroud)

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

var paddedSeries = fullDates.ToDictionary(date => date, date => timeSeries.ContainsDate(date) 
                                               ? timeSeries[date] : defaultValue);
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要一个持续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,依此类推,从而生成日期范围. (6认同)
  • 你应该使用`TotalDays`而不是'Days` (6认同)
  • 我真的很喜欢这个for循环。您并不是每天都会在“DateTime”上看到循环。 (4认同)
  • @yellowblood:为什么?不需要小数天。 (2认同)

Ant*_*ram 31

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*ams 25

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

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

并像这样使用它

    var dates = new DateTime(2000, 1, 1).Range(new DateTime(2000, 1, 31));
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*plo 5

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