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

Posted

技术标签:

【中文标题】创建两个日期之间所有日期的数组或列表[重复]【英文标题】: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 填充这些系列。

【问题讨论】:

【参考方案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...***.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);

 

【讨论】:

以上是关于创建两个日期之间所有日期的数组或列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql选择查询中获取两个日期之间的日期列表[重复]

SQL列表在两个日期之间重复发生日期,结束日期为下一个开始日期

获取两个日期时间变量之间的小时列表 [重复]

打印两个日期之间的所有日期[重复]

打印两个日期之间的所有日期[重复]

如何从两个日期中创建日期数组?