zoukankan      html  css  js  c++  java
  • 比较2个时刻日期字串的时间差

    比较2个时刻日期字串的时间差

    一、背景
    有时需要比较2个时刻日期字串的时间差
    '2009-02-28 00:00:04'
    '2010-03-01 01:02:03'
    时间差为
    1年0个月6天 1个小时1分钟59秒

    二、分析
    采用python,
    编写比较函数:gap_start2end('2009-02-28 00:00:04','2010-03-01 01:02:03')
    返回时间差的组合表示数:((1, 0, 6), (1, 1, 59))

    三、封装好的函数方法

    import time
    import datetime
    import math
    
    
    # 一、相同日期格式的时间距离
    
    def date2obj(date_str='2015-04-07 19:11:21', format='%Y-%m-%d %H:%M:%S'):
        '''
        日期字串 转 日期对象
        :param date_str:日期字串
        :param format:日期字串格式
        :return:日期对象
        d_obj.year  输出 2015
        d_obj.month  输出 4
        d_obj.day  输出 7
        '''
        t_str = date_str
        d_obj = datetime.datetime.strptime(t_str, format)
    
        return d_obj
    
    
    # 1、s秒时间间隔
    def time_seconds_span(start_date1, end_date2, fomart1='%Y-%m-%d %H:%M:%S', fomart2='%Y-%m-%d %H:%M:%S'):
        d1_obj = date2obj(start_date1, fomart1)
        d2_obj = date2obj(end_date2, fomart2)
    
        return (d2_obj - d1_obj).seconds
    
    
    # 2、min分钟时间间隔
    def time_minutes_span(start_date1, end_date2, fomart1='%Y-%m-%d %H:%M:%S', fomart2='%Y-%m-%d %H:%M:%S'):
        d1_obj = date2obj(start_date1, fomart1)
        d2_obj = date2obj(end_date2, fomart2)
        seconds_span = (d2_obj - d1_obj).seconds
        # 向下取整
        mins_span = math.floor(seconds_span / 60)
    
        return mins_span
    
    
    # 3、h小时时间间隔
    def time_hours_span(start_date1, end_date2, fomart1='%Y-%m-%d %H:%M:%S', fomart2='%Y-%m-%d %H:%M:%S'):
        d1_obj = date2obj(start_date1, fomart1)
        d2_obj = date2obj(end_date2, fomart2)
        seconds_span = (d2_obj - d1_obj).seconds
        # 向下取整
        hours_span = math.floor(seconds_span / (60 * 60))
    
        return hours_span
    
    
    # 4、d天数时间间隔。无论是否带有h、min、s,计算时,会忽略h、min、s,只计算天数、月数和年数。
    def date_days_span(start_date1, end_date2, fomart1='%Y-%m-%d', fomart2='%Y-%m-%d'):
        d1_obj = date2obj(start_date1, fomart1)
        d2_obj = date2obj(end_date2, fomart2)
    
        # 只取天数差值。等同于向下取整。
        days_span = (d2_obj - d1_obj).days
    
        return days_span
    
    
    # 5、month月数时间间隔。无论是否带有h、min、s,计算时,会忽略h、min、s,只计算天数、月数和年数。
    def date_months_span(start_date1, end_date2, fomart1='%Y-%m-%d', fomart2='%Y-%m-%d'):
        d1_obj = date2obj(start_date1, fomart1)
        d2_obj = date2obj(end_date2, fomart2)
    
        # 向下取整。只取天数。
        days_span = (d2_obj - d1_obj).days
        months_span = math.floor(days_span / 30)
    
        return months_span
    
    
    # 6、year年数时间间隔。无论是否带有h、min、s,计算时,会忽略h、min、s,只计算天数、月数和年数。
    def date_years_span(start_date1, end_date2, fomart1='%Y-%m-%d', fomart2='%Y-%m-%d'):
        d1_obj = date2obj(start_date1, fomart1)
        d2_obj = date2obj(end_date2, fomart2)
    
        # 向下取整。只取天数。
        days_span = (d2_obj - d1_obj).days
        years_span = math.floor(days_span / (12 * 30))
    
        return years_span
    
    
    def gap_start2end(start_str, end_str, start_fomart='%Y-%m-%d %H:%M:%S', end_fomart='%Y-%m-%d %H:%M:%S'):
        '''
        比较两个时刻的时间差
        :param start_str: 起始时刻日期字串
        :param end_str: 截止时刻日期字串
        :param start_fomart: 起始时刻日期字串读取格式
        :param end_fomart: 截止时刻日期字串读取格式
        :return: 时刻差值组合数的数组((y, m, d), (h, min, sec))
        # 举例说明:
        '2009-02-28 00:00:04' ,
        '2010-03-01 01:02:03'
        输出((1, 0, 6), (1, 1, 59))
        含义为:时间间隔1年0个月6天,1小时1分钟59秒
    
        # 时间回推说明:
        # sum_days = y * 30 * 12 + m * 30 + d
        # sum_seconds = sum_days * 24 * 60 * 60 + h * 60 * 60 + min * 60 + sec
        '''
    
        # 年数差
        years_gap = date_years_span(start_str, end_str, start_fomart, end_fomart)
        # 月数差
        months_gap = date_months_span(start_str, end_str, start_fomart, end_fomart)
        # 天数差
        days_gap = date_days_span(start_str, end_str, start_fomart, end_fomart)
        # 取出日期的组合表示数
        y = years_gap
        m = months_gap % 12
        d = days_gap % 30
    
        # 小时数差
        hours_gap = time_hours_span(start_str, end_str, start_fomart, end_fomart)
        # 分钟数差
        mins_gap = time_minutes_span(start_str, end_str, start_fomart, end_fomart)
        # 秒数差
        seconds_gap = time_seconds_span(start_str, end_str, start_fomart, end_fomart)
        # 取出时间的组合表示数
        h = hours_gap
        min = mins_gap % 60
        sec = seconds_gap % 60
    
        return ((y, m, d), (h, min, sec))
    
    
    if __name__ == '__main__':
        # # 1、计算秒差。
        # start_date1 = '2015-04-07 00:00:00'
        # end_date1 = '2015-04-08 00:01:01'
        # seconds_span = time_seconds_span(start_date1, end_date1)
        # print(seconds_span)
        #
        # # 2、计算分钟差。向下取整
        # start_date2 = '2015-04-07 00:00:00'
        # end_date2 = '2015-04-07 00:01:01'
        # mins_span = time_minutes_span(start_date2, end_date2)
        # print(mins_span)
        #
        # # 3、计算小时差。向下取整
        # start_date3 = '2015-04-07 00:00:00'
        # end_date3 = '2015-04-07 02:01:00'
        # hours_span = time_hours_span(start_date3, end_date3)
        # print(hours_span)
        #
        # # 4、计算天数差。向下取整
        # start_date4 = '2015-04-07'
        # end_date4 = '2015-04-15'
        # days_span = date_days_span(start_date4, end_date4)
        # print(days_span)
        #
        # # 5、计算月数差。向下取整
        # start_date5 = '2015-04-02'
        # end_date5 = '2015-05-03'
        # months_span = date_months_span(start_date5, end_date5)
        # print(months_span)
        #
        # # 6、计算年数差。向下取整
        # start_date6 = '2015-04-02'
        # end_date6 = '2017-05-03'
        # years_span = date_years_span(start_date6, end_date6)
        # print(years_span)
    
        # 一、相同日期格式的时间距离
        start_date = '2009-02-28 00:00:04'
        end_date = '2010-03-01 01:02:03'
        cha = gap_start2end(start_date, end_date)
        print(cha)
    

      

  • 相关阅读:
    MyBatis学习总结(5)——实现关联表查询
    MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突
    MyBatis学习总结3-优化MyBatis配置文件
    各种数据库的数据类型
    Ubuntu下jdk配置
    null和""的区别
    单例模式
    知识体系(不断更新)
    Servlet错误一览
    如何锻炼敲代码的能力
  • 原文地址:https://www.cnblogs.com/andy9468/p/12627663.html
Copyright © 2011-2022 走看看