1

C# で利子計算機を開発しています。2 間の日数を知る必要がありますdates

だから、私はこのようなものを計算しています:

    DateTime dt1 = DateTime.ParseExact(DateTime.Now.Date.ToString("dd-MM-yy"), "dd-MM-yy", CultureInfo.InvariantCulture).Date;
    DateTime dt2 = DateTime.ParseExact(Duration, "dd-MM-yy", CultureInfo.InvariantCulture).Date;

    Double no_days = (dt1 - dt2).TotalDays;

ただし、月によって日数が異なります。したがって、2 月 15 日から 3 月 15 日までは、日数が 30 未満であっても 1 か月を構成します。

経過月数を確認する方法はありますか? 利息の計算は、月末に行われます。

ありがとう

4

4 に答える 4

8

これよりもクリーンな方法は考えられません。

((dt1.Year - dt2.Year) * 12) + (dt1.Month - dt2.Month) - (dt1.Day < dt2.Day?1:0);

それでも、いくつかのエッジケースを見逃した可能性があるかどうかはわかりません。

于 2013-01-12T06:23:51.107 に答える
1

あなたは常に物事を想定しているため、これについて明確な答えはあまりありません。

このソリューションは、比較のために月の日を保存することを想定して、2 つの日付の間の月を計算します (つまり、月の日が計算で考慮されます)。

たとえば、2012 年 1 月 30 日の日付がある場合、2012 年 2 月 29 日は月ではなく、2013 年 3 月 1 日になります。

かなり徹底的にテストされており、後で使用する際にクリーンアップされる可能性がありますが、次のとおりです。

private static int TotalMonthDifference(DateTime dtThis, DateTime dtOther)
{
    int intReturn = 0;
    bool sameMonth = false;

    if (dtOther.Date < dtThis.Date) //used for an error catch in program, returns -1
        intReturn--;

    int dayOfMonth = dtThis.Day; //captures the month of day for when it adds a month and doesn't have that many days
    int daysinMonth = 0; //used to caputre how many days are in the month

    while (dtOther.Date > dtThis.Date) //while Other date is still under the other
    {
        dtThis = dtThis.AddMonths(1); //as we loop, we just keep adding a month for testing
        daysinMonth = DateTime.DaysInMonth(dtThis.Year, dtThis.Month); //grabs the days in the current tested month

        if (dtThis.Day != dayOfMonth) //Example 30 Jan 2013 will go to 28 Feb when a month is added, so when it goes to march it will be 28th and not 30th
        {
            if (daysinMonth < dayOfMonth) // uses day in month max if can't set back to day of month
                dtThis.AddDays(daysinMonth - dtThis.Day);
            else
                dtThis.AddDays(dayOfMonth - dtThis.Day);
        }
        if (((dtOther.Year == dtThis.Year) && (dtOther.Month == dtThis.Month))) //If the loop puts it in the same month and year
        {
            if (dtOther.Day >= dayOfMonth) //check to see if it is the same day or later to add one to month
                intReturn++;
            sameMonth = true; //sets this to cancel out of the normal counting of month
        }
        if ((!sameMonth)&&(dtOther.Date > dtThis.Date))//so as long as it didn't reach the same month (or if i started in the same month, one month ahead, add a month)
            intReturn++;
    }
    return intReturn; //return month
}
于 2014-01-07T18:47:50.407 に答える
0

私は自分のルーチンを書くことになった。それが他の人の助けになることを願っています。2つの日付の間の月を計算する簡単な方法があるかどうか教えてください。

DateTime dt1 = DateTime.ParseExact(DateTime.Now.Date.ToString("dd-MM-yy"), "dd-MM-yy", CultureInfo.InvariantCulture).Date;
DateTime dt2 = DateTime.ParseExact(Duration, "dd-MM-yy", CultureInfo.InvariantCulture).Date;

DateTime temp = dt2;
int no_months = 0;
while ((dt1 - temp).TotalDays > 0)
{
    temp = temp.AddMonths(1);
    no_months++;
}

if (no_months > 0)
{
    no_months = no_months - 1;
}

ありがとう

于 2013-01-14T16:19:36.340 に答える
0
int MonthsElapsed = ((DateB.AddDays(1).Year - DateA.AddDays(1).Year) * 12) +
                    (DateB.AddDays(1).Month - DateA.AddDays(1).Month) -
                    (DateB.AddDays(1).Day < DateA.AddDays(1).Day ? 1 : 0);

この式は、いくつかの仮定を行っています。

  1. 1 か月とは、DateA の日から将来の月の同じ日までの期間です。(例: 1/15-2/15 = 1 か月、1/15-3/15 = 2 か月など) これをトリガー日と呼びます。
  2. トリガー日を含まない月の最終日は、トリガー日と同じです。(1/28~1/31~2/28は全て1ヶ月に相当します。)
  3. 最初の経過月は、1 か月が経過した後に発生します。(利息の計算を行うと、最初の月の利息は DateA に発生するため、この数式に 1 を追加します。)

.AddDays(1) は、DateB にトリガー日が含まれていない月末のシナリオを説明するために使用されます。それを説明する、より優雅でインラインの方法は考えられません。

于 2013-07-12T13:31:46.387 に答える