0

asp.net Web サイトに ddlPayrollDate というドロップダウン リストがあります。現在の月を含む過去 3 か月の日付 2 と 17 を挿入/バインドしたいと考えています。年がいつ変更されるかを考慮するために、以下に示す私のコードである C# コードに複数の条件を記述する必要がありました。

     ddlPayrollDate.Items.Insert(1, String.Format("{0:MMMM dd, yyyy}", new DateTime (DateTime.UtcNow.Year, DateTime.UtcNow.Month, 17)));
                ddlPayrollDate.Items.Insert(2, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, 2)));
                if (DateTime.UtcNow.Month != 1)
                    ddlPayrollDate.Items.Insert(3, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month - 1, 17)));
                else
                    ddlPayrollDate.Items.Insert(3, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year - 1, 12, 17)));

                if (DateTime.UtcNow.Month != 1)
                    ddlPayrollDate.Items.Insert(4, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month - 1, 2)));
                else
                    ddlPayrollDate.Items.Insert(4, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year - 1, 12, 2)));

                if (DateTime.UtcNow.Month != 1 && DateTime.UtcNow.Month != 2)
                    ddlPayrollDate.Items.Insert(5, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month - 2, 17)));
                else if (DateTime.UtcNow.Month == 1)
                    ddlPayrollDate.Items.Insert(5, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year - 1, 11, 17)));
                else
                    ddlPayrollDate.Items.Insert(5, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year - 1, 12, 17)));

                if (DateTime.UtcNow.Month != 1 && DateTime.UtcNow.Month != 2)
                    ddlPayrollDate.Items.Insert(6, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month - 2, 2)));
                else if (DateTime.UtcNow.Month == 1)
                    ddlPayrollDate.Items.Insert(6, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year - 1, 11, 2)));
                else
                    ddlPayrollDate.Items.Insert(6, String.Format("{0:MMMM dd, yyyy}", new DateTime(DateTime.UtcNow.Year - 1, 12, 2)));

日時関数を使用して、これらの多くの条件を持たずにこのコードを最適化する方法はありますか? 前もって感謝します!

4

3 に答える 3

4

ループが必要なようです。次のようなもの

DateTime now = DateTime.UtcNow;
// Use the start of the month to avoid concerns around short months etc
DateTime current = new DateTime(now.Year, now.Month, 1);

for (int i = 0; i < 3; i++)
{        
    // Add the 17th... (add 16 days to the 1st)
    ddlPayrollDate.Items.Insert(i * 2 + 1,
                                current.AddDays(16).ToString("MMMM dd, yyyy"));
    // Add the 2nd... (add 1 day to the 1st)
    ddlPayrollDate.Items.Insert(i * 2 + 2,
                                current.AddDays(1).ToString("MMMM dd, yyyy"));
    // Go back a month...
    current = current.AddMonths(-1);
}

これは、現在の日が 2 日より前、2 日と 17 日の間、または 17 日より後であるかに関係なく、現在の月 (UTC)の 17 日と 2 日が常に必要であると想定しています。

また、カスタムの日付形式を指定するときは、通常、インバリアント カルチャを使用する必要があることに注意してください。または、「通常の」カルチャで標準の日付形式を使用します。

于 2013-01-30T18:39:17.357 に答える
0
DateTime startDate = DateTime.Today.AddMonths(-3);

for (Int32 indexer=0; indexer < 3; indexer++) {
  ddlPayrollDate.Items.Add(String.Format("{0:MMMM dd, yyyy}", new DateTime(startDate,Year, startDate.Month, 2)));
ddlPayrollDate.Items.Add(String.Format("{0:MMMM dd, yyyy}", new DateTime(startDate,Year, startDate.Month, 17)));
startDate = startDate.AddMonth(1);
}
于 2013-01-30T18:37:55.677 に答える
0

DateTime.AddMonthsを使用する

たとえば、DateTime.UtcNow.AddMonths(-1) は、今日の日付の 1 か月前の日付を取得します。

于 2013-01-30T18:36:18.223 に答える