使用Python计算Linux Crontab定时任务下次运行时间,直接上代码:

#coding:utf8

import croniter, datetime, time

def datetime_to_timestamp(timestring, format="%Y-%m-%d %H:%M:%S"):
    """ 将普通时间格式转换为时间戳(10位), 形如 '2016-05-05 20:28:54',由format指定 """
    try:
        # 转换成时间数组
        timeArray = time.strptime(timestring, format)
    except Exception:
        raise
    else:
        # 转换成10位时间戳
        return int(time.mktime(timeArray))

def get_current_timestamp():
    """ 获取本地当前时间戳(10位): Unix timestamp:是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒 """
    return int(time.mktime(datetime.datetime.now().timetuple()))

def timestamp_after_timestamp(timestamp=None, seconds=0, minutes=0, hours=0, days=0):
    """ 给定时间戳(10位),计算该时间戳之后多少秒、分钟、小时、天的时间戳(本地时间) """
    # 1. 默认时间戳为当前时间
    timestamp = get_current_timestamp() if timestamp is None else timestamp
    # 2. 先转换为datetime
    d1 = datetime.datetime.fromtimestamp(timestamp)
    # 3. 根据相关时间得到datetime对象并相加给定时间戳的时间
    d2 = d1 + datetime.timedelta(seconds=int(seconds), minutes=int(minutes), hours=int(hours), days=int(days))
    # 4. 返回某时间后的时间戳
    return int(time.mktime(d2.timetuple()))


def timestamp_datetime(timestamp, format='%Y-%m-%d %H:%M:%S'):
    """ 将时间戳(10位)转换为可读性的时间 """
    # timestamp为传入的值为时间戳(10位整数),如:1332888820
    timestamp = time.localtime(timestamp)
    # 经过localtime转换后变成
    ## time.struct_time(tm_year=2012, tm_mon=3, tm_mday=28, tm_hour=6, tm_min=53, tm_sec=40, tm_wday=2, tm_yday=88, tm_isdst=0)
    # 最后再经过strftime函数转换为正常日期格式。
    return time.strftime(format, timestamp)

def CrontabRunNextTime(sched, timeFormat="%Y-%m-%d %H:%M", queryTimes=1):
    """计算定时任务下次运行时间
    sched str: 定时任务时间表达式
    timeFormat str: 格式为"%Y-%m-%d %H:%M"
    queryTimes int: 查询下次运行次数
    """
    try:
        now = datetime.datetime.now()
    except ValueError:
        raise
    else:
        # 以当前时间为基准开始计算
        cron = croniter.croniter(sched, now)
        return [ cron.get_next(datetime.datetime).strftime(timeFormat) for i in range(queryTimes) ]

def CrontabRunTime(sched, ctime, timeFormat="%Y-%m-%d %H:%M"):
    """计算定时任务运行次数
    sched str: 定时任务时间表达式
    ctime str: 定时任务创建的时间,与timeFormat格式对应
    timeFormat str: 格式为"%Y-%m-%d %H:%M"
    """
    try:
        ctimeStrp = datetime.datetime.strptime(ctime, timeFormat)
    except ValueError:
        raise
    else:
        # 根据定时任务创建时间开始计算
        cron = croniter.croniter(sched, ctimeStrp)
        now = get_current_timestamp()
        num = 0
        while 1:
            timestring = cron.get_next(datetime.datetime).strftime(timeFormat)
            timestamp = datetime_to_timestamp(timestring, "%Y-%m-%d %H:%M")
            if timestamp > now:
                break
            else:
                num += 1
        return num
            
sched="* */6 * * *"
ctime="2017-08-16 15:24"
print CrontabRunNextTime(sched)
print CrontabRunTime(sched, ctime)

使用方法:

CrontabRunNextTime("*/5 * * * *", queryTimes=3)

输出:

[‘2017-09-15 16:25’, ‘2017-09-15 16:30’, ‘2017-09-15 16:35’]

参考链接:https://ask.helplib.com/1573434

开放接口:https://open.saintic.com/#定时任务查询

·End·