代码之家  ›  专栏  ›  技术社区  ›  Andy Evans

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

  •  7
  • Andy Evans  · 技术社区  · 15 年前

    我有以下代码片段,用于获取两个日期之间的各个日期:

    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日、2010年5月1日和2010年6月1日。

    有什么想法吗?

    4 回复  |  直到 10 年前
        1
  •  26
  •   Lasse Espeholt    15 年前

    试试这个:

    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()

        2
  •  3
  •   Niloofar    12 年前

     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;
        }
    
        3
  •  1
  •   Dan Atkinson    13 年前

    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()

        4
  •  0
  •   Christian Hayter    15 年前

    DateTime[] calendarMonthBoundaries = Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days)
        .Select(offset => startDate.AddDays(offset))
        .Where(date => date.Day == 1)
        .ToArray();