创建两个日期之间所有日期的数组或列表[重复]
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选择查询中获取两个日期之间的日期列表[重复]