python中求月份差值

        Python 中的datetime 能满足很多的常用的功能,但是对 日期的月份处理,不是那么好, 比如如何计算两个datetime 相差几个月

没有办法解决.  timedelta 是不能传入months  的.写了一个脚本,计算两个日期的差值

方法1.直接看代码

from  datetime import datetime,date,timedelta
from dateutil.relativedelta import relativedelta



def month_delta(start_date, end_date):
    """
    返回 end_date  - start_date  的差值
        :param start_date:
        :param end_date:
        :return:  month_delta   int
    """
    flag = True
    if start_date > end_date:
        start_date, end_date = end_date, start_date
        flag = False
    year_diff = end_date.year - start_date.year
    end_month = year_diff * 12 + end_date.month
    delta = end_month - start_date.month
    return -delta if flag is False else delta


if __name__ == '__main__':

    end = date(2018, 4, 6)
    start = date(2018, 1, 3)

    a = datetime(2018, 3, 10, 9, 47,0)
    b = datetime(2017, 9, 8, 9, 47, 0)

    diff =month_delta(a,b)
    print(diff)
    print(month_delta(start, end))
    print(month_delta(end, start))

这样就可以了, 可以求出两个日期的差值. 

方法2:

后来 找到一个好用的库, dateutil ,这是对python datetime 扩展里面有很多功能, 这里主要说明,如果用它来计算月份差值

PyDev console: starting.
Python 3.6.4 (default, Jan  6 2018, 11:51:59) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
from dateutil.relativedelta import relativedelta
from  datetime import * 
a = datetime(2018,1,31)
a + relativedelta(months=1)
datetime.datetime(2018, 2, 28, 0, 0)
b1= a + relativedelta(months=1)
relativedelta(b1,a)
relativedelta(months=+1)
c=datetime(2018,8,10)
relativedelta(c,a)
relativedelta(months=+6, days=+10)
a +relativedelta(months=2)
datetime.datetime(2018, 3, 31, 0, 0)
a +relativedelta(months=3)
datetime.datetime(2018, 4, 30, 0, 0)
a +relativedelta(months=4)
datetime.datetime(2018, 5, 31, 0, 0)
a +relativedelta(months=5)
datetime.datetime(2018, 6, 30, 0, 0)
a +relativedelta(months=6)
datetime.datetime(2018, 7, 31, 0, 0)
a +relativedelta(months=7)
datetime.datetime(2018, 8, 31, 0, 0)
c
datetime.datetime(2018, 8, 10, 0, 0)
a
datetime.datetime(2018, 1, 31, 0, 0)
relativedelta(c,a)
relativedelta(months=+6, days=+10)

c =datetime.datetime(2018, 8, 10, 0, 0)

a = datetime.datetime(2018, 1, 31, 0, 0)

这里如果 relativedelta(c,a)   返回 是 months=6, days=10  虽然是对的, 但是不是我所希望的那样, 我希望的结果是 8-1 =7 

所以 还是有点问题, 不过可以 自动判断这个月是有多少天,a +relativedelta(months=1)  , 相减的时候并不是我希望的那样, 是months+days 的结果 datetime(2018, 1, 31, 0, 0)  +  6个月+ 10 天 ====   datetime(2018, 8, 10, 0, 0)     这个还是要注意下. 

dateutil  还有支持很多 years,weekday,days, hours 等等.这里主要说下这个months .



分享快乐,留住感动.    2018-03-10 10:53:46  --frank  

猜你喜欢

转载自blog.csdn.net/u010339879/article/details/79505570