【问题标题】: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

标签: python django python-datetime python-dateutil


【解决方案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)
      

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

      【讨论】:

        猜你喜欢
        • 2021-02-18
        • 1970-01-01
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 1970-01-01
        • 2014-11-26
        • 2015-06-20
        • 1970-01-01
        相关资源
        最近更新 更多