在两个日期之间创建月份数组

时间:2010-10-08 14:29:10

标签: c# datetime range

我使用以下代码段来获取两个日期之间的各个日期:

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。

有什么想法吗?

4 个答案:

答案 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();