电脑上按Ctrl + D,下次访问更方便
服务分类

Python计算两个日期相差天数 M + ACT/360模式,银行计算利息用

一般银行在计算计息的时候,都会用到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

发表回复

登录后才能评论
联系我们

联系我们

微信客服:

fuwu360微信客服

工作时间:周一至周五,9:30-18:30,节假日休息

返回顶部