Python计算两个日期相差天数 M + ACT/360模式,银行计算利息用
Python •
一般银行在计算计息的时候,都会用到M + ACT / 360模式,也就是满1个月按30天计算,不足一个月按实际天数计算。一年算360天。
例如:计算20151018到20190817相差的天数, 20151018到20190719是45个月, 20190718到 20190817是30天,45 * 30 + 30 = 1380天
用Python来实现这个计算,调用方式:calculate_days_m_act(‘20151018’, ‘20190817’)
代码如下:
# 计算两个日期相差天数 M + ACT模式,满1个月按30天计算,不足一个月按实际天数计算
# 参数说明date_start起始日期,date_end结束日期,日期格式例如:20190817
# 返回一个整数
import calendar
import datetime
import time
def calculate_days_m_act(date_start: str, date_end: str) -> int:
time_start = time.strptime(date_start, '%Y%m%d')
time_end = time.strptime(date_end, '%Y%m%d')
date_start = datetime.datetime(time_start[0], time_start[1], time_start[2])
date_end = datetime.datetime(time_end[0], time_end[1], time_end[2])
if date_start > date_end:
print("开始时间必须大于结束时间!")
return -1
# 两个日期相差的月份数
months = (date_end.year - date_start.year) * 12 + (date_end.month - date_start.month)
# 开始把开始日期变为距离结束日期最近的相似日期
if date_end.day < date_start.day:
# 如果结束日期的日小于起始日期的日 用上个月的日期来计算天数
# 月份减去一月
months -= 1
last_month_num = date_end.month - 1
year_of_last_month = date_end.year
# 如果结束日期的月份是1月份,则上个月的月份是12月
if date_end.month == 1:
last_month_num == 12
# 年份减去1年
year_of_last_month -= 1
else:
# 上个月的最大天数
max_days_of_last_month = calendar.monthrange(year_of_last_month, last_month_num)[1]
if date_start.day > max_days_of_last_month:
start_day = datetime.datetime(year_of_last_month, last_month_num, max_days_of_last_month)
else:
start_day = datetime.datetime(year_of_last_month, last_month_num, date_start.day)
else:
# 把开始日期变为距离结束日期最近的相似日期,日不变,年和月变为与结束日期一样
start_day = datetime.datetime(date_end.year, date_end.month, date_start.day)
return months * 30 + (date_end - start_day).days