【问题标题】:How to calculate the number of months between two DateTimes?如何计算两个日期时间之间的月数?
【发布时间】:2009-04-20 15:41:25
【问题描述】:

要求:

  • 计算月数 在两个日期之间:receiveDate 和 到期日。
  • 既乐观又悲观 需要计算

假设:

  • dueDate 将始终是该月的最后一天。

我已经算出了悲观的计算方式(意思是逾期一天算一整月:

if(receiveDate > dueDate)
    receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12;

在互联网上进行搜索发现了几个类似的例子来证实这一点。

现在,我的直觉告诉我,乐观的计算结果将是相同的减去一个月,但由于某种原因,它感觉不对。我是在正确的轨道上还是我错过了什么?

【问题讨论】:

  • 不理解“乐观/悲观”的东西。两个日期之间的月数是否定义为“两个日期之间有一天或多天的月数,包括在内”?在这种情况下,不会只有一个正确答案。
  • 这真的取决于您如何看待部分月份。在一种情况下,部分月份会被忽略,而在另一种情况下,它们会被视为整月。

标签: c# datetime


【解决方案1】:

你是对的;如果您要查找两个日期之间的 complete 个月数,减去 1(假设 receiveDate 不属于该月的最后一天,在这种情况下,您将有剩下的 0 天)将为您提供答案。

【讨论】:

    【解决方案2】:

    如果您不需要在微积分中保留月份中的几天,我认为这是要走的路。

    【讨论】:

      【解决方案3】:

      您的公式计算从 receivedDate 的第一个月到 dueDate 的第一个月之间的月数。由于 TimeSpan 中的大多数时间元素都表示为 TotalXXX,因此它们省略了 TotalMonths 和 TotalYears 似乎很奇怪。

      我认为这是因为每个月没有固定的天数,所以很难知道在如何表示小数余数方面什么最有意义。

      我的公式是这样的……

      int nMonthDiff_FirstToFirst = DateTime.Now.Month - testDate.Month + ((DateTime.Now.Year - testDate.Year)* 12); double dMonthDiff = (double)nMonthDiff_FirstToFirst + (DateTime.Now - testDate.AddMonths(nMonthDiff_FirstToFirst)).TotalDays / (double)DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);

      所以我所做的基本上是像你一样获得月差(月初到月初),然后我将 testDate 按月差预测到未来。然后用那个 TimeSpan 我得到 TotalDays 并将其除以该月的天数。因此,我代表的是当月剩余天数的小数部分。

      因此,如果您打算在 2012 年 5 月 5 日 -> 2012 年 6 月 3 日进行,那么当尚未经过整整一个月时,您的公式将返回 1 来表示月差。在我的公式中,预计日期的 TotalDays 将产生一个负的小数天数,当添加到“第一个月到第一个月”的差异时,它会根据需要进行计算。

      【讨论】:

        【解决方案4】:

        我正在做这个额外的检查以获得准确的月份数:

        numberOfMonths = receiveDate.Month - dueDate.Month + (receiveDate.Year - dueDate.Year) * 12; if (receiveDate.Day > dueDate.Day) numberOfMonths--;

        【讨论】:

          【解决方案5】:
          int GetMonthsCount(DateTime dtStart, DateTime dtEnd)
          {
              return (int)Math.Round((dtEnd - dtStart).TotalMonths);
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-07-20
            • 2019-06-07
            • 2023-04-06
            • 2020-05-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多