Создать массив месяцев между двумя датами - PullRequest
7 голосов
/ 08 октября 2010

У меня есть следующий фрагмент, который я использую, чтобы получить отдельные даты между двумя датами:

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

Однако следующий раздел

endDate.Subtract(startDate).Days

не имеет .Months для возврата месяцев в диапазоне дат.

Например, если я предоставлю 01.01.2010 и 01.06.2010, я бы ожидал вернуться 01.01.2010, 01.02.2010, 01.03.2010, 01.04.2010, 5 / 1/2010 и 6/1 / 2010.

Есть идеи?

Ответы [ 4 ]

28 голосов
/ 08 октября 2010

Попробуйте это:

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() внутри метода.

3 голосов
/ 20 ноября 2013

Поскольку мне просто нужен был год и месяц между двумя датами, я немного изменил ответ Лассе Эспехолта.предположим: 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;
    }
1 голос
/ 08 октября 2010

Вы можете перечислить приращения месяцев с помощью:

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() для этого, если вы хотите массив. Это неплохо иметь значения, которые, вероятно, соответствуют желаемым; например если вы начнете с 31 января го , то получите 28 февраля го (или 29 го в високосные годы), затем 31 марта й 1012 *, затем 30 апреля th и т. Д.

0 голосов
/ 08 октября 2010

Это то, что вы ищете?Требование очень неоднозначное.

DateTime[] calendarMonthBoundaries = Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days)
    .Select(offset => startDate.AddDays(offset))
    .Where(date => date.Day == 1)
    .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...