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

avatar
Ghalib Ali
8 апреля 2018 в 08:26
159
1
-1

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

например,

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

Источник
Emre Savcı
8 апреля 2018 в 08:27
4

Возможный дубликат Как перебрать диапазон дат?

Francesco B.
8 апреля 2018 в 08:30
2

Почему февраль становится февралем, а апрель остается апрелем?

Steve
8 апреля 2018 в 08:31
0

Вам нужно перебрать эти диапазоны или вам просто нужен список с требуемыми датами?

derloopkat
8 апреля 2018 в 08:36
0

В основном вы создаете DateTime для первого дня и добавляете один день до достижения последнего дня. Используйте AddDays. Google для фрагмента.

Ghalib Ali
8 апреля 2018 в 08:38
0

цикл по диапазонам

Jon Skeet
8 апреля 2018 в 08:40
0

Неясно, на что указывает ваш комментарий «цикл по диапазонам», но похоже, что вы, вероятно, просто хотите рассмотреть три части результата: 1) месяц, который включает в себя начало; 2) месяцы полностью между началом и концом; 3) месяц, который включает конец. Вы можете захотеть обработать «начало и конец в одном месяце» как особый случай для простоты.

Ответы (1)

avatar
Francesco B.
8 апреля 2018 в 08:42
1

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

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

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

        }
    }

enter image description here

Ghalib Ali
8 апреля 2018 в 10:45
1

очень приятно, не могли бы вы попробовать эти даты (новый DateTime (2018, 2, 12), новый DateTime (2019, 11, 12)

Francesco B.
8 апреля 2018 в 11:28
0

Я думаю, вы спрашиваете, потому что на февраль 2019 года было 29 дней, верно? Я отредактировал свой код и протестировал его как для 2019, так и для 2020 года (високосный год).

Ghalib Ali
8 апреля 2018 в 11:34
0

вместо этого я печатаю результат, я сохраняю его в созданном списке

Ghalib Ali
8 апреля 2018 в 11:34
0

EventsDatesRangeList.Add(новый кортеж<DateTime>(FirstDay)); EventsDatesRangeList.Add(новый кортеж<DateTime>(LastDay));

Ghalib Ali
8 апреля 2018 в 11:36
0

замените код, затем проверьте результат, код изменит год на 2020 в финале

Francesco B.
8 апреля 2018 в 11:40
0

что за тип EventsDatesRangeList?

Francesco B.
8 апреля 2018 в 11:44
0

если тип List<Tuple<DateTime>>, я заменил его в своем коде и отредактировал сообщение. У меня не меняется год.

Ghalib Ali
8 апреля 2018 в 12:07
0

попробуйте (новый DateTime (2018, 11, 12), новый DateTime (2019, 2, 23)) затем отсортируйте список, и вы увидите, что он перешел на 02.01.2020

Ghalib Ali
8 апреля 2018 в 12:12
0

результат будет 11.12.2018,30/11/2018,01/12/2018,31/12/2018,01/01/2019,31/01/2019,23/02/2019,1/02/ 2020

Francesco B.
8 апреля 2018 в 12:56
0

Я попробовал даты, которые вы мне дали, но я не получил такого результата, я опубликовал то, что получил, проверьте мой ответ на картинку. Я скопировал и вставил код в свой ответ, а вы?

Ghalib Ali
10 апреля 2018 в 05:39
0

дорогой, не мог бы ты попробовать 17.01.2016 -- 30.04.2018 через 3 года

Ghalib Ali
16 апреля 2018 в 05:31
0

все еще пропущено 01-12-2017 -- 31-12-2017

Francesco B.
17 апреля 2018 в 12:40
0

Имея в виду...? Что случилось?

Ghalib Ali
18 апреля 2018 в 06:01
0

перешел с 01-11-2017 -- 30/11/2017 на 01/01/2018 --31/01/2018, который пропущен 01-12-2017 31-12-2017