python 计算起始日期相差年数、月数、天数及总天数

from datetime import datetime, timedelta


def diff_dates(s_date, e_date):
    """
    计算两个日期之间的年数、月数和天数差异
    :param s_date: 开始日期
    :param e_date: 结束日期
    :return: 年数、月数、天数差异及总天数
    """

    date_format = "%Y-%m-%d"  # 日期格式
    start_date = datetime.strptime(s_date, date_format)
    end_date = datetime.strptime(e_date, date_format)
    # print(start_date)
    # print(end_date)

    # 计算年份差异
    years_diff = end_date.year - start_date.year
    # print(f'计算年份差异:{years_diff}')

    # 如果结束日期的月份小于开始日期的月份,年数减去1
    if end_date.month < start_date.month or (end_date.month == start_date.month and end_date.day < start_date.day):
        # print('如果结束日期的月份小于开始日期的月份,年数减去1')
        years_diff -= 1

    # 计算月份差异
    months_diff = end_date.month - start_date.month
    # print(f'计算月份差异:{months_diff}')

    # 如果结束日期的月份小于开始日期的月份,月数加上12个月
    if end_date.month < start_date.month or (end_date.month == start_date.month and end_date.day < start_date.day):
        # print('如果结束日期的月份小于开始日期的月份,月数加上12个月')
        months_diff += 12

    # 如果结束日期的天数小于开始日期的天数,月数减去1
    if end_date.day < start_date.day:
        # print('如果结束日期的天数小于开始日期的天数,月数减去1')
        months_diff -= 1

    # 计算天数差异
    days_diff = end_date.day - start_date.day
    # print(f'计算天数差异:{days_diff}')

    # 如果结束日期的天数小于开始日期的天数
    if end_date.day < start_date.day:

        # 计算方式1:以结束日期所在月份的上一月判断是否为大小月【此方式与EXCEL中的DATEDIF(2024/3/15,2025/3/14,"MD")函数算法一致,算出来是27天】
        # print('判断结束日期所在月份的上一月是否为大小月')
        # if (end_date.month - 1) in [1, 3, 5, 7, 8, 10, 0]:
        #     # print('大月,天数加上31天')
        #     days_diff += 31
        #     # print(f'天数:{days_diff}')
        #
        # elif (end_date.month - 1) in [4, 6, 9, 11]:
        #     # print('小月,天数加上30天')
        #     days_diff += 30
        #     # print(f'天数:{days_diff}')
        #
        # elif ((end_date.month - 1) == 2) and (end_date.year % 4 == 0):
        #     # print('闰年,天数加上29天')
        #     days_diff += 29
        #     # print(f'天数:{days_diff}')
        #
        # elif ((end_date.month - 1) == 2) and (end_date.year % 4 != 0):
        #     # print('平年,天数加上28天')
        #     days_diff += 28
        #     # print(f'天数:{days_diff}')

        # 计算方式2:以开始日期所在月份判断是否为大小月
        # print('判断开始日期所在月份是否为大小月')
        if start_date.month in [1, 3, 5, 7, 8, 10, 12]:
            # print('大月,天数加上31天')
            days_diff += 31
            # print(f'天数:{days_diff}')

        elif start_date.month in [4, 6, 9, 11]:
            # print('小月,天数加上30天')
            days_diff += 30
            # print(f'天数:{days_diff}')

        elif (start_date.month == 2) and (end_date.year % 4 == 0):
            # print('闰年,天数加上29天')
            days_diff += 29
            # print(f'天数:{days_diff}')

        elif (start_date.month == 2) and (end_date.year % 4 != 0):
            # print('平年,天数加上28天')
            days_diff += 28
            # print(f'天数:{days_diff}')

    total_day = end_date - start_date

    return years_diff, months_diff, days_diff, total_day


# 假设从2023年1月1日开始
date = datetime(2023, 1, 1)

# 循环804次,每次日期增加1天
for _ in range(804):
    date1 = date.strftime('%Y-%m-%d')
    date2 = "2025-3-14"
    years, month, days, day = diff_dates(date1, date2)
    print(f'开始日期{date1}------结束日期{date2}相差{years}年{month}月{days}天,共计{day.days}天')

    date += timedelta(days=1)

测试运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值