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