计算日历月的两个日期之间的数[复制](Calculate the number of Calenda

2019-10-17 14:01发布

这个问题已经在这里有一个答案:

  • 差异月两个日期之间的 37个回答

我开发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。

任何IDE我怎么能确定的月数过去? 利息计算,在为期一个月的月底完成。

谢谢

Answer 1:

我想不出比这更清洁的方式:

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

即使如此,我不知道如果我也许错过了一些边缘情况。



Answer 2:

有没有很多关于这个,因为你总是假设事情说清楚的答案。

该解决方案两个日期的月之间计算假设你想保存一个月比较的日子,(这意味着该月的一天,在计算中考虑)之间

例如,如果你有30一月2012,2月29日的日期2012年将不会是一个月,但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
}


Answer 3:

最后我写我自己的程序。 我希望这会帮助别人。 让我知道是否有计算两个日期之间的月更简单的方法。

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;
}

谢谢



Answer 4:

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. 一个完整的月份是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不包含触发天。 我想不出占该更优美,在线方法。



文章来源: Calculate the number of Calendar Months between two dates [duplicate]