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)
测试运行结果: