一般银行在计算计息的时候,都会用到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
# 返回一个整数
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' 112 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_num1 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