如何计算特定日期的剩余月数?
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)
好处:不需要额外的包,所有都在标准包中。
在我的 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)
好处:不需要额外的包,所有都在标准包中。