适当减少手机使用,有助于视力保护... 新的一年祝您:身体健康,阖家欢乐!~~

python 时间差的处理代码 得到时间差的年月日时分秒

浏览量:603 作者:admin 类别:: 学习笔记 更新时间:2022-07-07 18:33:23
# %x本地相应的日期表示%X本地相应的时间表示
# %z当前时区的名称
# %%号本身
#
# %y两位数的年份表示(00-99)
# %Y四位数的年份表示(000-9999)
#
# %m月份(01-12)
# %d月内中的一天(0-31)
#
# %H24小时制小时数(0-23)
# %I 12小时制小时数(01-12)
#
# %M分钟数(00=59)
# %S秒(00-59)
# %f 微秒
# %a本地简化星期名称%A本地完整星期名称
# %b本地简化的月份名称%B本地完整的月份名称
# %c本地相应的日期表示和时间表示%j年内的一天(001-366)
# %p本地A.M.或P.M.的等价符su一年中的星期数(00-53)星期天为星期的开始
# %w星期(0-6),星期天为星期的开始W一年中的星期数(00-53)星期一为星期的开始
# strftime时间转字符串   strptime 字符串转时间

网上没有找到现成的轮子,就按照自己的想法,这样实现了。

如果有同样需求的,刚好看到,可以参考一下。

当然这不是唯一的方法,也许你的方法更好

from datetime import datetime
import numpy as np
# import pandas as pd
from datetime import *

import re

# 时间差,计算

# 输入2个日期

def time_duration(end_time, format_str='%Y-%m-%d %H:%M:%S', start_time=''):
    '''
    :param end_time:  截止时间
    :param start_time: 开始时间
    :param format_str: 时间格式 字符串
    :return:    结果 消息 {}  , 年 , 月, 日, 时, 分
    '''
    pass

    if not start_time:
        start_time = datetime.now().strftime(format_str)

    year = dur(end_time, 'year', start_time, format_str)
    month = dur(end_time, 'month', start_time, format_str)
    day = dur(end_time, 'day', start_time, format_str)
    hour = dur(end_time, 'hour', start_time, format_str)
    minute = dur(end_time, 'minute', start_time, format_str)

    return year, month, day, hour, minute


def dur(end, type, start='', f_str='%Y-%m-%d %H:%M:%S'):
    '''
    计算时间的年月日的差值
    :param end: 指定截止时间
    :param type:  year , mouth , day ...
    :param start:  指定开始时间 或当前时间
    :param f_str:  时间的格式化字符串
    :return:       int
    '''
    if start == '':
        start = datetime.now().strftime(f_str)
    # print(start,datetime.strptime(end, f_str).year)
    # 两种实现方法皆可:
    fstr = '''datetime.strptime(end, f_str).{}'''.format(type)
    e = eval(fstr)
    s_str = '''datetime.strptime(start, f_str).{}'''.format(type)
    s = eval(s_str)

    # e_str = '''a = datetime.strptime('{}', '{}').{}'''.format(str(end), f_str, type)
    # result = {}
    # exec(e_str, globals(), result)  # 这个就正常执行了。
    # print(result)
    # print(fstr)
    # exec(fstr) 无返回值 , 且不能直接使用外部的变量。 但可以使用globals() 来接受结果。
    # execute 执行的意思
    # exec(fstr, globals(), result) # 结果 NameError: name 'end' is not defined
    # 发现第一个参数 是未定义的,就是使用不了传进来外部变量。
    
    return e - s


def dur_mouth_days(end, start='', f_str='%Y-%m-%d %H:%M:%S'):
    if start == '':
        start = datetime.now().strftime(f_str)

    # 天数,需要计算 mouth_has_days 返回指定年月的天数

    # 相差的时分秒,可能为负数
    year, month, day, hour, minute = time_duration(end)

    end_nouth = datetime.strptime(end, f_str).month
    end_year = datetime.strptime(end, f_str).year
    print('end_nouth type:', type(end_nouth))

    # 处理存在的负数
    if minute < 0 :
        minute = 60 + minute
        hour = hour - 1

    if hour < 0 :
        hour = 24 + hour
        day = day - 1

    if day < 0 :
        # 按截止月的天数 计算
        day = mouth_has_days(int(end_year),int(end_nouth)) + day
        month = month - 1

    if month < 0:
        month += 12
        year = year - 1

    if year < 0:
        return {'statu':'0','msg':'end befor the start'}


    return year, month, day, hour, minute



    pass


def mouth_has_days(year, mouth):
    #也可以使用 calendar 包
    '''
    import calendar
    calendar.monthlen(2021,6)
    30
    calendar.monthrange(2021,6)  返回一个tuple,第一个元素是这个月第一天是星期几,第二个是这个月的天数
    (1, 30)
    :param year:
    :param mouth:
    :return:
    '''
    year = abs(int(year))
    mouth = abs(int(mouth))
    # print(mouth)
    try:
        import calendar
        return calendar._monthlen(year, mouth)
    except Exception as e:
        # print(e)
        pass
    import time
    fun = lambda year, month: list(
        range(1, 1 + time.localtime(time.mktime((year, month + 1, 1, 0, 0, 0, 0, 0, 0)) - 86400).tm_mday))
    days = fun(year, mouth)  # list
    # print(days)
    return len(days)








print('exec_和_eval', dur("2022-08-01 10:00:00",'year'))
print('某年某月有几天:', mouth_has_days(2022,-7))

print('今天距离,2023-01-05 10:00:00,还有', dur_mouth_days("2022-08-01 10:00:00"))


关于博主
北京南城网络及弱电【张工】为您提供:
校园网、楼宇、村镇、园区,光纤网络覆盖,无线覆盖 华为|H3c|锐捷|爱快|panabit等品牌,路由、交换机、AC、AP 无源光网络(PON)设备,布署、调试、维运,等服务...
应急/临时光纤熔接...[藤仓22S]
博文为学习python所写:内容摘自网络、学习笔记、记事备忘。
QQ:872876353,欢迎交流学习、加Q注明来意。

诗文鉴赏

《满江红》· 岳飞
落星侵晓没,
残月半山低。
怒发冲冠,
凭栏处、潇潇雨歇。
抬望眼、仰天长啸,壮怀激烈。
三十功名尘与土,八千里路云和月。
莫等闲、白了少年头,
空悲切。
源于生活-记录日常
The site based on python 3 with flask...