如何计算特定日期的剩余月份? [复制]

Posted

技术标签:

【中文标题】如何计算特定日期的剩余月份? [复制]【英文标题】:How to calculate months left to particular date? [duplicate] 【发布时间】:2015-02-19 19:35:37 【问题描述】:

在我的 django 应用程序中,我有一些约会。 我需要使用完整(四舍五入)月份来计算距离该日期还有多少个月。 例如:今天是 19/02/2015(二月),我的“搜索”日期是 04/08/2015。差值应为 6。 如何获得合适的值?

【问题讨论】:

@Mark R.:我不同意,当你仔细阅读问题时,有重要的区别! This post 搞定了!使用dateutil.relativedelta 【参考方案1】:
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)

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

【讨论】:

【参考方案2】:

我喜欢箭头库: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)

【讨论】:

【参考方案3】:

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

获取不同日期的日期对象(参见 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)

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

【讨论】:

以上是关于如何计算特定日期的剩余月份? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将月份值从一个 Date 对象复制到另一个对象? [复制]

如何在 mysql 5.7 上显示从月份的第一个日期到 MYSQL 5.7 上的月底日期的日期? [复制]

如何在unix bash shell中减去或添加两个特定的日期和时间[复制]

为啥我不能从我的 DataFrame 中的“日期”列中提取月份的列? [复制]

如何在 android 日期选择器中将特定选定日期设置为最小日期? [复制]

如何更改 <input type=Date> 的特定日期的颜色? [复制]