1

日付範囲を受け入れるWebサービスがあり、大量のデータがインポートされているため、日付範囲パラメーターを1か月間のみ渡しています。

許容される開始日の形式:1-apr-2012

許容される終了日の形式:2012年4月30日

2012年1月1日から2012年8月31日までのように、過去2年間の毎月の開始日と終了日をプログラムで送信したい

以下は私がテストを開始したコードのサンプルですが、終了日と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日になる可能性があり、うるう年の考慮には1年かかるため、これには1か月かかります。

月の最終日に追加AddMonth(1)する必要はありません。つまり、翌月の最終日になります。

このシナリオを想像してください

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

dtt = dtt.AddMonths(1);

現在、9月30日は9月の最終日ですが、AddMonth(1)10月30日になるとわかります。しかし、10月の最終日は30日ではなく31日です。

したがって、1月の最初の日付は

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 に答える