参考java版本:Cron转中文
本文把java版本改写为python版本
代码如下
CRON_TIME_CN = ["秒", "分", "点", "天", "月", "周", "年"]
HOURS = 24
TIMESCALE = 60
def translate_cron_to_chinese(cronExp, cronTimeArr):
tmpCorns = cronExp.split()
sBuffer = ""
if len(tmpCorns) in [6, 7]:
if len(tmpCorns) == 7:
# 解析年 Year
year = tmpCorns[6]
if year not in ["*", "?", "?"]:
sBuffer = sBuffer + year + cronTimeArr[6]
# 解析月 Month 主要解析
months = tmpCorns[4]
if months not in ["*", "?", "?"]:
if "/" in months:
sBuffer = sBuffer + "从" + months.split("/")[0] + "号开始,每" + months.split("/")[1] + cronTimeArr[4]
else:
if "-" in sBuffer:
sBuffer = sBuffer + "每年"
sBuffer = sBuffer + months + cronTimeArr[4]
# 解析周 DayofWeek 主要解析 , - 1~7/L 1L~7L
dayofWeek = tmpCorns[5]
if dayofWeek not in ["*", "?", "?"]:
if "," in dayofWeek:
sBuffer = sBuffer + "每周的第" + dayofWeek + cronTimeArr[3]
elif "L" in dayofWeek and len(dayofWeek) > 1:
weekNum = dayofWeek.split("L")[0]
weekName = judgeWeek(weekNum)
sBuffer = sBuffer + "每月的最后一周的" + weekName
elif "-" in dayofWeek:
splitWeek = dayofWeek.split("-")
weekOne = judgeWeek(splitWeek[0])
weekTwo = judgeWeek(splitWeek[1])
sBuffer = sBuffer + "每周的" + weekOne + "到" + weekTwo
else:
if "L" == dayofWeek:
dayofWeek = "7"
sBuffer = sBuffer + "每周的" + judgeWeek(dayofWeek)
# 解析日 days -- DayofMonth 需要解析的 / # L W
# * “6#3”表示本月第三周的星期五(6表示星期五,3表示第三周);
# * “2#1”表示本月第一周的星期一;
# * “4#5”表示第五周的星期三。
days = tmpCorns[3]
if days not in ["*", "?", "?"]:
if "/" in days:
sBuffer = sBuffer + "每周从第" + days.split("/")[0] + "天开始,每" + days.split("/")[1] + cronTimeArr[3]
elif "L" == days:
sBuffer = sBuffer + "每月最后一天"
elif "W" in days:
daynum = days.replace("W", "")
sBuffer = sBuffer + "每月离" + daynum + "号最近的那个工作日"
elif "#" in days:
splitDays = days.split("#")
weekNum = splitDays[0]
weekOfMonth = splitDays[1]
weekName = judgeWeek(weekNum)
sBuffer = sBuffer + "每月第" + weekOfMonth + cronTimeArr[5] + weekName
else:
sBuffer = sBuffer + "每月" + days + "号"
else:
if (len(sBuffer) == 0 or len(tmpCorns) == 7) and "星期" not in sBuffer:
sBuffer += ("每" + cronTimeArr[3])
# 解析时 Hours 主要解析 /
hours = tmpCorns[2]
if "*" != hours:
if "/" in hours:
sBuffer = sBuffer + append_gap_info(hours, HOURS, 2)
else:
if len(sBuffer) == 0:
sBuffer = sBuffer + "每天" + hours + cronTimeArr[2]
else:
sBuffer = sBuffer + hours + cronTimeArr[2]
# 解析分 Minutes 主要解析 /
minutes = tmpCorns[1]
if "*" != minutes:
if "/" in minutes:
sBuffer = sBuffer + append_gap_info(minutes, TIMESCALE, 1)
elif minutes == "0":
pass
elif "-" in minutes:
splitMinute = minutes.split("-")
sBuffer = sBuffer + splitMinute[0] + cronTimeArr[1] + "到" + splitMinute[1] + cronTimeArr[1] + "每分钟"
else:
sBuffer = sBuffer + minutes + cronTimeArr[1]
# 解析秒 Seconds 主要解析 /
seconds = tmpCorns[0]
if "*" != seconds:
if "/" in seconds:
sBuffer = sBuffer + append_gap_info(seconds, TIMESCALE, 0)
elif "0" != seconds:
sBuffer = sBuffer + seconds + cronTimeArr[0]
if len(sBuffer) > 0:
sBuffer += "执行"
else:
sBuffer += "表达式中文转换异常"
else:
sBuffer += "表达式中文转换异常"
return sBuffer
def judgeWeek(weekNum):
data = {
"1": "星期天",
"2": "星期一",
"3": "星期二",
"4": "星期三",
"5": "星期四",
"6": "星期五",
"7": "星期六",
"SUN": "星期天",
"MON": "星期一",
"TUE": "星期二",
"WED": "星期三",
"THU": "星期四",
"FRI": "星期五",
"SAT": "星期六",
}
return data[weekNum]
def append_gap_info(time, rangeNum, index):
sBufferTemp = ""
splitTime = time.split("/")
startNum = splitTime[0]
gapNum = splitTime[1]
endNum = rangeNum + int(startNum) - int(gapNum)
endStr = str(endNum)
timeUnit = CRON_TIME_CN[index]
splitTimeUnit = CRON_TIME_CN[index]
if index == 1:
splitTimeUnit = "分钟"
elif index == 2:
splitTimeUnit = "小时"
sBufferTemp = sBufferTemp + "从" + startNum + timeUnit + "开始到" + endStr + timeUnit + "范围内,每隔" + gapNum + splitTimeUnit
return sBufferTemp
if __name__ == '__main__':
# 测试示例
cron_expression = "0 0 1 15W * ?"
chinese_translation = translate_cron_to_chinese(cron_expression, CRON_TIME_CN)
print(chinese_translation)