1

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

可接受的开始日期格式:2012 年 4 月 1 日

可接受的结束日期格式:2012 年 4 月 30 日

我想以编程方式发送过去 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();
    }

更正的代码:

 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();
    }
4

3 回答 3

6

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

int DateTime.DaysInMonth(int year, int month);

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

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

想象一下这个场景

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

dtt = dtt.AddMonths(1);

现在 9 月 30 日是 9 月的最后一个日期,但当我们AddMonth(1)给我们 30 月时。但 10 月的最后一个日期是 31 日而不是 30 日。

所以如果一月份的第一次约会将是

DateTime startdateofamonth = new DateTime(2011, 1, 1);

而最后日期将是

DateTime lastdateofamonth = new DateTime(2011, 1, DateTime.DaysInMonth(2011,1));
于 2012-08-07T07:15:22.693 回答
2

你可以做:

var firstDateOfMonth = new DateTime(dt.Year, dt.Month, 1);
var last = new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);

所以你的代码应该是:

  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);
            while (dt < dt2)
            {
                var first = new DateTime(dt.Year, dt.Month, 1);
                var last = new DateTime(dt.Year, dt.Month, 1).AddMonths(1).AddDays(-1);
                Console.Write(String.Format("{0:dd-MMM-yyyy}", first));
                Console.Write("== To == ");
                Console.WriteLine(String.Format("{0:dd-MMM-yyyy}", last));
                dt = dt.AddMonths(1);
            }
            Console.Read();
        }

输出将是:

01-Apr-2011== To == 30-Apr-2011
01-May-2011== To == 31-May-2011
01-Jun-2011== To == 30-Jun-2011
01-Jul-2011== To == 31-Jul-2011
01-Aug-2011== To == 31-Aug-2011
01-Sep-2011== To == 30-Sep-2011
01-Oct-2011== To == 31-Oct-2011
01-Nov-2011== To == 30-Nov-2011
01-Dec-2011== To == 31-Dec-2011
01-Jan-2012== To == 31-Jan-2012
01-Feb-2012== To == 29-Feb-2012
01-Mar-2012== To == 31-Mar-2012
01-Apr-2012== To == 30-Apr-2012
于 2012-08-07T07:21:05.283 回答
1

我不确定这是不是你的意思,

开始日期是第一位的,因此您应该能够通过 new 获得它,DateTime(2011,[month],1)您需要增加月份(不要超过 12 !)

此外,您可以使用DateTime.DaysInMonth可以添加到您的开始日期(通过AddDays())并到达结束日期的月份中的天数。

于 2012-08-07T07:17:37.480 回答