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