zoukankan      html  css  js  c++  java
  • 比较2个时刻日期字串的时间差:距离现在的时间距离(不同时间格式)

    比较2个时刻日期字串的时间差:距离现在的时间距离(不同时间格式)

    一、背景
    有时需要比较2个时刻日期字串的时间差:距离现在的时间距离(不同时间格式)
    '20200401'
    现在的时间
    时间差为:
    0年0个月2天 17个小时46分钟16秒

    二、分析
    采用python,
    编写比较函数:gap_start2end('20200401', "现在的日期字串", start_fomart='%Y%m%d', end_fomart='%Y-%m-%d %H:%M:%S')
    返回时间差的组合表示数:((0, 0, 2), (17, 46, 16))

    三、封装好的函数方法

    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))
    
    
    def time2date(timeint=1565673941, format="%Y-%m-%d %H:%M:%S"):
        '''
        时间戳转为日期字串,单位s,秒
        :param timeint:时间戳
        :return:日期字串
        输出举例说明:
        (1565673941, "%Y-%m-%d %H:%M:%S")  输出  2019-08-13 13:25:41
        (1565673941, "%Y-%m-%d")  输出  2019-08-13
        (1565673941, "%Y%m%d")  输出  20190813
        '''
        local_time = time.localtime(timeint)
        data_head = time.strftime(format, local_time)
    
        return data_head
    
    if __name__ == '__main__':
        # # 一、相同日期格式的时间距离。
        # 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)
    
        # 二、不同日期格式的时间距离。距离现在的时间距离
        start_date = '20200401'
        end_date = time2date(time.time())
        cha_now = gap_start2end(start_date, end_date, start_fomart='%Y%m%d', end_fomart='%Y-%m-%d %H:%M:%S')
        print(cha_now)
    

      

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/andy9468/p/12627927.html
Copyright © 2011-2022 走看看