如何在C#中生成包含月份跨度的系列

Pra*_*tik 1 c# asp.net datetime date

我有一个接受日期范围的web服务,由于大量数据导入,我只传递了1个月的日期范围参数.

可接受的开始日期格式:1-apr-2012

可接受的结束日期格式:30-apr-2012

我想以编程方式发送每个月的过去2年的开始和结束日期,如2012年1月1日至2012年8月31日

下面是我开始测试的示例代码段,但是当我添加结束日期加上1个月时,它会给我30天的时间.

static void Main(string[] args)
    {
        string startDt = "1-apr-2011";
        string endDt = "30-apr-2012";
        DateTime dt = Convert.ToDateTime(startDt);
        DateTime dt2 = Convert.ToDateTime(endDt);
        CultureInfo culture = CultureInfo.GetCultureInfo("en-GB");

        //Console.WriteLine(value.ToString("D", culture)); 

        while (dt < dt2)
        {
            Console.WriteLine(dt.ToString("D", culture));
           // Console.WriteLine(String.Format("{0:dd-MM-yyyy}", dt));
            dt = dt.AddMonths(1);                
        }
        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

更正代码:

 static void Main(string[] args)
    {
        string startDt = "1-apr-2011";
        string endDt = "30-apr-2012";
        DateTime dt = Convert.ToDateTime(startDt);
        DateTime dt2 = Convert.ToDateTime(endDt);
        CultureInfo culture = CultureInfo.GetCultureInfo("en-GB"); 
        while (dt < dt2)
        {
            DateTime dtend = new DateTime(dt.Year, dt.Month, DateTime.DaysInMonth(dt.Year, dt.Month)); 
            Console.WriteLine(dt.ToString("D", culture));
            Console.WriteLine(dtend.ToString("D", culture));               
            dt = dt.AddMonths(1);                
        }
        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

Nik*_*wal 6

每个月的第一个日期将是1,但是对于您必须使用的最后日期

int DateTime.DaysInMonth(int year, int month);
Run Code Online (Sandbox Code Playgroud)

这需要一个月,因为月份可以是28,29,30或31天,并且需要一年的闰年考虑.

添加AddMonth(1)到一个月的最后日期并不意味着它将给出下个月的最后日期.

想象这个场景

DateTime dtt = new DateTime(2012, 09, 30);

dtt = dtt.AddMonths(1);
Run Code Online (Sandbox Code Playgroud)

现在30-Sept是9月的最后一个日期,但是当我们AddMonth(1)给它们10月30日.但是10月的最后一次是31日不是30日.

所以,如果1月份的第一个日期将是

DateTime startdateofamonth = new DateTime(2011, 1, 1);
Run Code Online (Sandbox Code Playgroud)

而最后的日期将是

DateTime lastdateofamonth = new DateTime(2011, 1, DateTime.DaysInMonth(2011,1));
Run Code Online (Sandbox Code Playgroud)