Получить списки дат между двумя датами C #

как я могу получить список диапазонов дат между двумя датами

Например,

start date - 12 февраля end date - 23 мая

итак, результат должен быть как

12-Feb to 28-Feb 1-Mar to 31-Mar 1-April to 30-April 1-May to 23-May


person Ghalib Ali    schedule 08.04.2018    source источник
comment
Возможный дубликат Как перебрать диапазон дат в цикле?   -  person Emre Savcı    schedule 08.04.2018
comment
почему февраль становится февралем, а апрель остается апрелем?   -  person Francesco B.    schedule 08.04.2018
comment
Вам нужно перебрать эти диапазоны или вам просто нужен список с требуемыми датами?   -  person Steve    schedule 08.04.2018
comment
В основном вы создаете DateTime для первого дня и добавляете один день до достижения последнего дня. Используйте AddDays. Гугл за снайпером.   -  person derloopkat    schedule 08.04.2018
comment
петля по диапазонам   -  person Ghalib Ali    schedule 08.04.2018
comment
Непонятно, что должен обозначать ваш комментарий цикла по диапазонам, но похоже, что вы, вероятно, просто хотите рассмотреть три части результата: 1) месяц, который включает начало; 2) месяцы полностью между началом и концом; 3) месяц, включающий конец. Для простоты вы можете захотеть обработать начало и конец в том же месяце, что и специальный случай.   -  person Jon Skeet    schedule 08.04.2018


Ответы (1)


Допустим, вы проверяете только один год, то есть текущий (2018). Конечно, вы можете сделать StartDate и EndDate параметрическими.

В приведенном ниже коде нет ничего особенного; Я использовал "d-MMMM" в качестве формата даты, поскольку вы, казалось, запрашивали минимальное количество дней ("d" делает это, т. Е. Выбирает 1, а не 01 для первого дня месяца) и "длинное" название месяца ("MMMM" делает проверьте этот ответ). Если вместо этого вам нужно просто сокращение, например «февраль» для «февраля», вы можете использовать «MMM» (отметьте этот другой ответ ).

DateTime StartDate = new DateTime(2018, 2, 12);
DateTime EndDate = new DateTime(2018, 5, 23);

for (int i = 0; i <= EndDate.Month - StartDate.Month; i++)
{
    DateTime FirstDay = new DateTime(2018, StartDate.Month + i, 1);
    if (i == 0)
    {
        FirstDay = StartDate;
    }
    DateTime LastDay = new DateTime(2018, StartDate.Month + i, DateTime.DaysInMonth(2018, FirstDay.Month));
    if (i == EndDate.Month - StartDate.Month)
    {
        LastDay = EndDate;
    }
    Console.WriteLine(FirstDay.ToString("d-MMMM") + " to " + LastDay.ToString("d-MMMM"));
}

Console.ReadLine();

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

static void Main(string[] args)
{
    PrintDateList(new DateTime(2018, 2, 12), new DateTime(2018, 5, 23));
    PrintDateList(new DateTime(2018, 11, 12), new DateTime(2019, 2, 23));

    Console.ReadLine();
}

private static void PrintDateList(DateTime StartDate, DateTime EndDate)
{
    Console.WriteLine("");
    int TotalMonths = EndDate.Month - StartDate.Month +
                     (EndDate.Year - StartDate.Year) * 12;

    int CurrentYear = StartDate.Year;
    int MonthsToSubtract = 0;

    for (int i = 0; i <= TotalMonths; i++)
    {
        int CurrentMonth = StartDate.Month + i;

        if (StartDate.Month + i > 12)
        {
            if ((StartDate.Month + i) % 12 == 1)
            {
                CurrentYear++;
                Console.WriteLine(CurrentYear.ToString());
                MonthsToSubtract = StartDate.Month + i - 1;
            }

            CurrentMonth = StartDate.Month + i - MonthsToSubtract;
        }

        DateTime FirstDay = new DateTime(CurrentYear, CurrentMonth, 1);
        if (i == 0)
        {
            FirstDay = StartDate;
        }
        DateTime LastDay = new DateTime(CurrentYear, CurrentMonth, DateTime.DaysInMonth(CurrentYear, FirstDay.Month));
        if (i == TotalMonths)
        {
            LastDay = EndDate;
        }
        Console.WriteLine(FirstDay.ToString("d-MMMM") + " to " + LastDay.ToString("d-MMMM"));
    }
}

На выходе

12 февраля - 28 февраля
1 марта - 31 марта
1 апреля - 30 апреля
1 мая - 23 мая

12 ноября - 30 ноября
1 декабря - 31 декабря
1 января - 31 января
1 февраля - 23 февраля

Поскольку вы спросили, я заменил Console.WriteLine на List:

private static void PrintDateList(DateTime StartDate, DateTime EndDate)
{
        List<Tuple<DateTime>> EventsDatesRangeList = new List<Tuple<DateTime>>();
        Console.WriteLine("");
        int TotalMonths = EndDate.Month - StartDate.Month +
                        (EndDate.Year - StartDate.Year) * 12;

        int CurrentYear = StartDate.Year;
        int MonthsToSubtract = 0;

        for (int i = 0; i <= TotalMonths; i++)
        {
            int CurrentMonth = StartDate.Month + i;

            if (StartDate.Month + i > 12)
            {
                if ((StartDate.Month + i) % 12 == 1)
                {
                    CurrentYear++;
                    Console.WriteLine(CurrentYear.ToString());
                    MonthsToSubtract = StartDate.Month + i - 1;
                }

                CurrentMonth = StartDate.Month + i - MonthsToSubtract;
            }

            DateTime FirstDay = new DateTime(CurrentYear, CurrentMonth, 1);
            if (i == 0)
            {
                FirstDay = StartDate;
            }
            DateTime LastDay = new DateTime(CurrentYear, CurrentMonth, DateTime.DaysInMonth(CurrentYear, FirstDay.Month));
            if (i == TotalMonths)
            {
                LastDay = EndDate;
            }
                Console.WriteLine(FirstDay.ToString("d-MMMM") + " to " + LastDay.ToString("d-MMMM"));
            EventsDatesRangeList.Add(new Tuple<DateTime>(FirstDay));
            EventsDatesRangeList.Add(new Tuple<DateTime>(LastDay));

        }
    }

введите описание изображения здесь

person Francesco B.    schedule 08.04.2018
comment
очень приятно, не могли бы вы попробовать эти даты (новый DateTime (2018, 2, 12), новый DateTime (2019, 11, 12) - person Ghalib Ali; 08.04.2018
comment
Думаю, вы спрашиваете, потому что на февраль 2019 года было 29 дней, верно? Я отредактировал свой код и протестировал его как на 2019, так и на 2020 год (високосный год). - person Francesco B.; 08.04.2018
comment
см. insted я распечатываю результат я сохраняю его в созданном списке - person Ghalib Ali; 08.04.2018
comment
EventsDatesRangeList.Add (новый Tuple ‹DateTime› (Первый день)); EventsDatesRangeList.Add (новый Tuple ‹DateTime› (LastDay)); - person Ghalib Ali; 08.04.2018
comment
замените код, затем проверьте результат, код изменит год на 2020 в окончательном - person Ghalib Ali; 08.04.2018
comment
какой тип EventsDatesRangeList? - person Francesco B.; 08.04.2018
comment
если тип List<Tuple<DateTime>>, я заменил его в своем коде и отредактировал сообщение. Я не получаю изменения года. - person Francesco B.; 08.04.2018
comment
попробуйте (new DateTime (2018, 11, 12), new DateTime (2019, 2, 23)), затем отсортируйте список, вы увидите, что он перешел на 1/2/2020 - person Ghalib Ali; 08.04.2018
comment
результат будет 12/11 / 2018,30 / 11 / 2018,01 / 12 / 2018,31 / 12 / 2018,01 / 01 / 2019,31 / 01 / 2019,23 / 02 / 2019,1 / 02 / 2020 г. - person Ghalib Ali; 08.04.2018
comment
Я попробовал даты, которые вы мне назвали, но я не получил того результата, я опубликовал то, что получил, проверьте свой ответ на картинке. Я скопировал и вставил код в свой ответ, а вы? - person Francesco B.; 08.04.2018
comment
уважаемый не могли бы вы попробовать 17.01.2016 - 30.04.2018 кросс 3 года - person Ghalib Ali; 10.04.2018
comment
все еще пропускается 01-12-2017 - 31-12-2017 - person Ghalib Ali; 16.04.2018
comment
Значение...? Что случилось? - person Francesco B.; 17.04.2018
comment
перескочил с 01-11-2017 - 30.11.2017 на 01.01.2018 - 31.01.2018, который пропущен 01-12-2017 31-12-2017 - person Ghalib Ali; 18.04.2018