获取2个日期之间的日期列表C#

时间:2018-04-08 08:26:14

标签: c# asp.net

我如何获得2个日期之间的日期范围列表

例如,

  

start date是2月12日     end date是5月23日

所以,结果必须像

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

1 个答案:

答案 0 :(得分:1)

假设您只检查一年,即当前的一年(2018年)。 当然,您可以StartDateEndDate参数化。

下面的代码没什么特别之处;我使用"d-MMMM"作为日期格式,因为您似乎要求最少天数("d"这样做,即在第一天选择1而不是01月份)和月份的“长”名称(“MMMM”这样做,检查this answer)。 如果您只想要缩写,即“二月”为“二月”,您可以使用“MMM”(选中this other answer)。

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

输出

  2月12日至2月28日   3月1日至3月31日   4月1日至4月30日   5月1日至5月23日

     11月12日至11月30日   12月1日至12月31日   1月1日至1月31日   2月1日至2月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