# %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"))