16

次のエレガントなソリューションを知っているかどうか疑問に思っています。

2009 年 6 月 30 日があり、1 か月追加すると、2009 年 7 月 30 日ではなく、2009 年 7 月 31 日になります。

このロジックは、2009 年 6 月 30 日が 6 月の終わりであり、1 か月を追加するときに次の月末に移動したいという事実に基づいています。

しかし、2009 年 6 月 29 日があり、1 か月追加すると、2009 年 7 月 29 日になるはずです。

任意の月数を追加できる必要があり、うるう年を考慮する必要があることに注意してください。

また、ここでのロジックには疑問があることは承知していますが、将来の月の月末に行われる月末契約で機能するビジネス要件です。

私はいくつかの解決策を考えましたが、非常にエレガントなものはありません。したがって、誰かがより良い方法を持っているのではないかと考えていました。

乾杯アンソニー

4

10 に答える 10

37

日付が月末かどうかを確認するには、翌日が月の 1 日かどうかを確認します。アルゴリズムは、「その日が月末でない場合は 1 か月を追加します。月末の場合は、1 日を追加し、1 か月を追加し、1 日を減算します。」

    bool IsEndOfMonth(DateTime date) {
        return date.AddDays(1).Day == 1;
    }
    DateTime AddMonthSpecial(DateTime date) {
        if (IsEndOfMonth(date))
            return date.AddDays(1).AddMonths(1).AddDays(-1);
        else
            return date.AddMonths(1);
    }
于 2009-06-11T02:05:34.390 に答える
2
DateTime exampleDate = DateTime.Parse("12/31/2009");
bool isLastDayOfMonth = (exampleDate.AddDays(1).Month != exampleDate.Month);

if (isLastDayOfMonth)
    Console.WriteLine(exampleDate.AddDays(1).AddMonths(1).AddDays(-1));
else
    Console.WriteLine(new DateTime(exampleDate.Year, exampleDate.Month, 1).AddMonths(2).AddDays(-1));

編集:あなたの質問をもう一度読みました。月の最終日かどうかを確認するには、チェックを入れる必要があります。

申し訳ありませんが、何が必要かという質問を明確に読んでおけばよかったです。
何が必要かを理解するのにこれで十分だと思います。

于 2009-06-11T02:15:50.717 に答える
1

前月の1日から1日さかのぼってたどり着くことができますか?

于 2009-06-11T02:05:43.110 に答える
0

次のようなDateTime.DaysInMonth()メソッドを使用できます。

DateTime workingMonth = new DateTime(2009, 06, 30).AddDays(1);
int nextMonthDays = DateTime.DaysInMonth(workingMonth.Year, workingMonth.Month);
DateTime newMonth = new DateTime(workingMonth.Year, workingMonth.Month, nextMonthDays);
于 2009-06-11T04:19:31.220 に答える
0

これは、私が月の初めにいるかどうかを確認するための補数機能になりますか? DateTime.Now.AddDays(-1).Month == DateTime.Now.AddMonths(-1).Month

于 2014-01-16T11:57:18.843 に答える
0
  1. 古い日付が「月末」であるかどうかをテストします。
    1. 日付に 1 日追加して、月数が変わるかどうかを確認します。
  2. 月を追加
  3. 古い日付が「月末」だった場合
    1. 日付を 1 に設定します
    2. もう一ヶ月追加
    3. 1日引く
于 2009-06-11T02:08:37.753 に答える
0

この問題への私のアプローチは、特定の日が月の最後の日であるかどうかを判断するルーチンを持つことから始まります (もちろん、うるう年の 2 月を考慮に入れます!)

また、その月の 1 日を指定すると、その月の最後の日を与えるルーチンも必要になります。

次に、最終日である日が見つかった場合は、1 日を追加し、2 番目のルーチンを使用してその月の最終日を取得します。複数の月間ループを使用します。

于 2009-06-11T02:10:29.200 に答える
0

EndOfMonth() と isEndOfMonth() を実装できます。

あなたのコードは多かれ少なかれ、

if isEndOfMonth( this.Date() )
  endDate = (startmonth + addedMonths).EndOfMonth()
else
  endDate = startDate + addedMonths

少し単純ですが、アイデアはわかります。

もちろん、ここには EndOFMonth と isEndOfMonth のロジックに関する多くのアイデアがあります

于 2009-06-11T02:12:34.063 に答える
0

以下は、うるう年などをカウントする単純な .NET C# ソリューションです。

static DateTime ContractDue(DateTime start, int months)
{
     if (start.Month == start.AddDays(1).Month)
     { // Same month, just add the months
            return start.AddMonths(months);
     }
     // Last day of month... add a day, add the months, then go back one day
     return start.AddDays(1).AddMonths(months).AddDays(-1);
}
于 2009-06-11T02:18:41.100 に答える
-1

EndOfMonthまたは単純なAddNMonthのみが必要な場合は、すでに答えが得られています。

それ以外の場合、完全な汎用ソリューションを使用するには、 Outlook会議インターフェイスのUIに表示されるRecurrenceパターンの実装が必要になります。Outlookの実装を使用することはお勧めしませんが、購入できる.NETコンポーネントがいくつかあるはずです。または、自分で実装しますが、すべてを過小評価して単体テストしないでください。実装するのは非常に難しいコンポーネントです。

于 2009-06-11T04:06:14.773 に答える