python 计算两个日期间隔年月日


由于项目需要计算租赁合同,起租日与终止日 间隔期限,找了半天是以365天算一年30天算一个月,不是自己想要的结果

一跨平闰年就有问题!不知道还有没有好的方法,下面是两种算间隔的方法


#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   calc_date_diff.py
@Contact :   zht_hai@163.com
@License :   (C)Copyright 2018-2019

@Modify Time      @Author    @Version    @Desciption
------------      -------    --------    -----------
2019/8/23 15:23   zht_hai      1.0         None
'''
import calendar
import datetime

start_date = datetime.date(2019, 7, 3)
end_date = datetime.date(2021, 6, 3)

print("日期间隔天数===>",(end_date-start_date).days)
print(start_date.year,start_date.month,start_date.day)
print(end_date.year,end_date.month,end_date.day)

def getMonthFirstDayAndLastDay(year=int, month=int):
    """
    计算日期当前月份起始第一天与最后一天
    :param year: 年份,int类型
    :param month: 月份,int类型
    :return: firstDay: 当月的第一天
              lastDay: 当月的最后一天
    """
    firstDayWeekDay, monthRange = calendar.monthrange(year, month)
    firstDay = datetime.date(year=year, month=month, day=1).day
    lastDay = datetime.date(year=year, month=month, day=monthRange).day
    return firstDay, lastDay

def calcDateDiff(start_date=datetime, end_date=datetime):
    """
    :param start_date:
    :param end_date:
    :return:  日期间隔年月天
    """
    middle_str = ''
    start_date_first_day,start_date_last_day = getMonthFirstDayAndLastDay(start_date.year,start_date.month)
    end_date_first_day, end_date_last_day = getMonthFirstDayAndLastDay(end_date.year, end_date.month)
    # 同年
    if start_date.year == end_date.year:
        if (start_date.day == start_date_first_day and end_date.day == end_date_last_day) and start_date.month != end_date.month:
            diff_months = end_date.month - start_date.month + 1
            if diff_months == 12:
                middle_str += '1年'
            else:
                middle_str += str(diff_months) + '月'
        if (start_date.day == start_date_first_day and end_date.day == end_date_last_day) and start_date.month == end_date.month:
                middle_str += '1月'

        if (start_date.day != start_date_first_day and end_date.day != end_date_last_day) and start_date.month == end_date.month:
                middle_str += str(end_date.day - start_date.day ) + '天'
        else:
            if ((start_date.day > start_date_first_day and start_date.day < start_date_last_day) and
                (end_date.day > end_date_first_day and end_date.day < end_date_last_day) ) or \
                    (start_date.day != start_date_first_day and end_date.day == end_date_first_day) or \
                    (start_date.day == start_date_last_day and end_date.day != end_date_first_day):
                is_one_month = start_date_last_day - start_date.day + 1 + end_date.day
                diff_days = 0
                diff_months = 0
                if is_one_month > end_date_last_day:
                    diff_months = end_date.month - start_date.month
                    diff_days = is_one_month - end_date_last_day
                if is_one_month == end_date_last_day:
                    diff_months = end_date.month - start_date.month
                if is_one_month < end_date_last_day:
                    diff_months = end_date.month - start_date.month -1
                    diff_days = is_one_month
                if diff_months > 0:
                    middle_str += str(diff_months) + '月'
                if diff_days > 0:
                    middle_str += str(diff_days) + '天'
            if start_date.day == start_date_first_day and end_date.day != end_date_last_day:
                diff_months = end_date.month - start_date.month
                diff_days = end_date.day
                if diff_months > 0:
                    middle_str += str(diff_months) + '月'
                middle_str += str(diff_days) + '天'
            if end_date.day == end_date_last_day and start_date.day != start_date_first_day:
                diff_months = end_date.month - start_date.month
                diff_days = start_date_last_day - start_date.day + 1
                if diff_months > 0:
                    middle_str += str(diff_months) + '月'
                if diff_days > 0:
                    middle_str += str(diff_days) + '天'
    else:
        #年份不相同直接取月份计算
        start_surplus_months = 12 - start_date.month
        end_date_before_months = end_date.month - 1
        sum_months = 0
        if end_date.year - start_date.year == 1:
            sum_months = start_surplus_months + end_date_before_months
        if end_date.year - start_date.year > 1:
            sum_months = start_surplus_months + end_date_before_months + (end_date.year - start_date.year -1) * 12
        if start_date.day == start_date_first_day and end_date.day == end_date_last_day:
            sum_months += 2
            diff_years = sum_months // 12
            diff_months = sum_months % 12
            if diff_years > 0:
                middle_str += str(diff_years) + '年'
            if diff_months > 0:
                middle_str += str(diff_months) + '月'
        if start_date.day == start_date_first_day and end_date.day != end_date_last_day:
            sum_months += 1
            diff_years = sum_months // 12
            diff_months = sum_months % 12
            if diff_years > 0:
                middle_str += str(diff_years) + '年'
            if diff_months > 0:
                middle_str += str(diff_months) + '月'
            middle_str += str(end_date.day) + '天'
        if start_date.day != start_date_first_day and end_date.day == end_date_last_day:
            sum_months += 1
            diff_years = sum_months // 12
            diff_months = sum_months % 12
            if diff_years > 0:
                middle_str += str(diff_years) + '年'
            if diff_months > 0:
                middle_str += str(diff_months) + '月'
            middle_str += str(start_date_last_day - start_date.day + 1) + '天'

        if ((start_date.day > start_date_first_day and start_date.day < start_date_last_day) and
            (end_date.day > end_date_first_day and end_date.day < end_date_last_day)) or \
                (start_date.day != start_date_first_day and end_date.day == end_date_first_day) or \
                (start_date.day == start_date_last_day and end_date.day != end_date_first_day):
            is_one_month = start_date_last_day - start_date.day + 1 + end_date.day
            if is_one_month >= end_date_last_day:
                sum_months += 1
                diff_years = sum_months // 12
                diff_months = sum_months % 12
                if diff_years > 0:
                    middle_str += str(diff_years) + '年'
                if diff_months > 0:
                    middle_str += str(diff_months) + '月'
                diff_days = is_one_month - end_date_last_day
                if diff_days > 0:
                    middle_str += str(diff_days) + '天'
            else:
                diff_years = sum_months // 12
                diff_months = sum_months % 12
                if diff_years > 0:
                    middle_str += str(diff_years) + '年'
                if diff_months > 0:
                    middle_str += str(diff_months) + '月'
                middle_str += str(is_one_month) + '天'
    return middle_str

print("日期间隔1===>",calcDateDiff(start_date,end_date))

def calcDateDiff2(start_date=datetime, end_date=datetime):
    result_str = ''
    diff_days = (end_date - start_date).days
    start_date_first_day,start_date_last_day = getMonthFirstDayAndLastDay(start_date.year,start_date.month)
    end_date_first_day, end_date_last_day = getMonthFirstDayAndLastDay(end_date.year, end_date.month)
    # 获取间隔年数:
    year = diff_days // 365
    if year > 0:
        result_str += str(year) + '年'
    # 间隔月数
    month = diff_days % 365 // 30
    if month > 0:
        result_str += str(month) + '月'
    # 间隔天数:
    day = diff_days % 365 % 30
    if day > 0:
        result_str += str(day) + '日'
    return result_str
print("日期间隔2===>",calcDateDiff2(start_date,end_date))

 


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值