如何计算特定日期的剩余月数?

How to calculate months left to particular date?

在我的 Django 应用程序中,我有一些约会。 我需要使用完整(四舍五入)月份来计算到这个日期还有多少个月。 例如:今天是 19/02/2015(二月),我的 "search" 日期是 04/08/2015。差异应为 6。 我怎样才能得到一个合适的值?

我喜欢箭头库:http://crsmithdev.com/arrow/

例如

 d1 = arrow.get("19/02/2015", "DD/MM/YYYY")
 d2 = arrow.get("04/08/2015", "DD/MM/YYYY")

 (d2-d1).days

您将决定如何进行计算。除以 30 或提取月份并减去这些月份。

d2.month - d1.month

处理它超过一年:

 ((d2.year * 100) + d2.month) - ((d1.year * 100) + d1.month)
from datetime import datetime,timedelta
from calendar import monthrange

today = datetime.today()
dt = "04/08/2015"

fut = datetime.strptime(dt, "%d/%m/%Y")
diff = 0
while today <= fut:
    today += timedelta(days=monthrange(today.day,today.month)[1])
    diff += 1
print(diff)
6

如果不导入日历,我们可以在每次看到新月份时增加计数:

from datetime import datetime,timedelta

today = datetime.today() 
dt = "09/08/2015"

fut = datetime.strptime(dt, "%d/%m/%Y")
diff = 0
while today <= fut:
    mon = today.month
    today += timedelta(days=1)
    if today.month != mon:
        diff += 1
print(diff)
6

如果你想让未来的一天成为该月的最后一天:

from datetime import datetime, timedelta
from calendar import monthrange

today = datetime.today()
dt = "02/08/2015"

fut = datetime.strptime(dt, "%d/%m/%Y")
fut = fut + timedelta(days=monthrange(fut.day,fut.month)[1]-fut.day)
diff = 0
while today < fut:
    mon = today.month
    today += timedelta(days=1)
    if today.month != mon:
        diff += 1
print(diff)

这是故意不准确的,以便根据需要四舍五入,我们只关心我们遇到的不同月份的数量。

要计算月差(四舍五入),我会朝这个方向走:

  • 获取不同日期的日期对象(参见 datetime 包)。这很容易,因为构造函数需要年月日
  • 计算日期之间的差异"date2 - date1" 这会自动给出一个 timedelta 对象
  • 通过在 timedelta 对象上调用 "total_seconds()" 获取两个日期之间的秒差
  • 秒数除以 24*60*60 得到天数
  • 将天数除以 30 或(如您所愿)31 将得到月数。您可以根据需要四舍五入。

这应该足够了:

    d,m,y = date1.split('/')
    d1 = datetime.date(y, m, d)
    d,m,y = date1.split('/')
    d2 = datetime.date(y, m, d)
    delta = d2 - d1
    days  = delta.total_seconds() // (24*60*60)
    result = int(days/30.0+0.5)

好处:不需要额外的包,所有都在标准包中。