我使用以下代码段来获取两个日期之间的各个日期:
DateTime[] output = Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days)
.Select(offset => startDate.AddDays(offset))
.ToArray();
但是,以下部分
endDate.Subtract(startDate).Days
没有.Months来返回日期范围内的月份。
例如,如果我提供2010年1月1日和2010年6月1日,我希望返回2010年1月1日,2010年2月1日,2010年3月1日,2010年4月1日,5 / 1/2010和6/1/2010。
有什么想法吗?
答案 0 :(得分:27)
试试这个:
static IEnumerable<DateTime> monthsBetween(DateTime d0, DateTime d1)
{
return Enumerable.Range(0, (d1.Year - d0.Year) * 12 + (d1.Month - d0.Month + 1))
.Select(m => new DateTime(d0.Year, d0.Month, 1).AddMonths(m));
}
这包括开始月份和结束月份。这会查找有多少个月,然后根据DateTime
的年份和月份创建新的d0
。这意味着月份就像yyyy-MM-01
。如果您希望它包含d0
的时间和日期,则可以new DateTime(d0.Year, d0.Month, 1).AddMonths(m)
替换d0.AddMonths(m)
。
我认为您需要一个数组,在这种情况下,您只需使用monthsBetween(..., ...).ToArray()
或将.ToArray()
放在方法中。
答案 1 :(得分:3)
由于我只需要在两个日期之间的年份和月份,我修改了Lasse Espeholt的答案。假设: d0 = 2012-11-03
d1 = 2013-02-05
结果将是这样的:
2012-11
2012-12
2013-01
2013-02
private List<Tuple<int,int>> year_month_Between(DateTime d0, DateTime d1)
{
List<DateTime> datemonth= Enumerable.Range(0, (d1.Year - d0.Year) * 12 + (d1.Month - d0.Month + 1))
.Select(m => new DateTime(d0.Year, d0.Month, 1).AddMonths(m)).ToList();
List<Tuple<int, int>> yearmonth= new List<Tuple<int,int>>();
foreach (DateTime x in datemonth)
{
yearmonth.Add(new Tuple<int, int>(x.Year, x.Month));
}
return yearmonth;
}
答案 2 :(得分:1)
您可以使用以下内容枚举月份增量:
private static IEnumerable<DateTime> ByMonths(DateTime startDate, DateTime endDate)
{
DateTime cur = startDate;
for(int i = 0; cur <= endDate; cur = startDate.AddMonths(++i))
{
yield return cur;
}
}
然后如果你想要一个数组就调用ToArray()
。拥有可能符合要求的价值是相当不错的;例如如果你从1月31日 st 开始,你接下来将获得2月28日 th (或闰年29 th ),然后3月31日 st ,然后是4月30日 th 等等。
答案 3 :(得分:0)
这是你在找什么?要求非常模糊。
DateTime[] calendarMonthBoundaries = Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days)
.Select(offset => startDate.AddDays(offset))
.Where(date => date.Day == 1)
.ToArray();