帮我写一个可以直接运行的html他是corn解析器请用js实现功能1输入6位格式的corn表达式对应秒、分、时、天、月、周点击输出可以输出10个最近会触发运行cron的具体日期格式类似2022-01-02 120201功能2用表格列出几个cron示例他也是6位格式的corn表达式对应秒、分、时、天、月、周分别是每秒每分每小时每天10点每周一10点还有每月1号会触发的cron表达式
<!DOCTYPE html>
<html>
<head>
<title>Cron解析器</title>
<meta charset="utf-8">
<style>
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
}
</style>
</head>
<body>
<h1>Cron解析器</h1>
<h2>功能1:输入6位格式的cron表达式,输出10个最近会触发运行cron的具体日期</h2>
<form>
<label for="cron">请输入cron表达式:</label>
<input type="text" id="cron" name="cron" pattern="^(\*|[0-5]?\d)(\/[0-5]?\d)?\s+(\*|[0-5]?\d)(\/[0-5]?\d)?\s+(\*|[01]?\d|2[0-3])(\/[01]?\d|2[0-3])?\s+(\*|[0-2]?\d|3[01])(\/[0-2]?\d|3[01])?\s+(\*|1[0-2]|0?[1-9])(\/[01]?\d)?\s+(\*|[0-6])(\/[0-6])?$" required>
<button type="button" onclick="calculate()">输出</button>
</form>
<div id="result"></div>
<pre><code><h2>功能2:示例cron表达式</h2>
<table>
<tr>
<th>秒</th>
<th>分</th>
<th>时</th>
<th>天</th>
<th>月</th>
<th>周</th>
<th>说明</th>
</tr>
<tr>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>每秒</td>
</tr>
<tr>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>0</td>
<td>每分</td>
</tr>
<tr>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>0</td>
<td>每小时</td>
</tr>
<tr>
<td>*</td>
<td>0</td>
<td>10</td>
<td>*</td>
<td>*</td>
<td>*</td>
<td>每天10点</td>
</tr>
<tr>
<td>*</td>
<td>0</td>
<td>10</td>
<td>*</td>
<td>*</td>
<td>1</td>
<td>每周一10点</td>
</tr>
<tr>
<td>*</td>
<td>*</td>
<td>0</td>
<td>1</td>
<td>*</td>
<td>*</td>
<td>每月1号</td>
</tr>
</table>
<script>
function calculate() {
var cron = document.getElementById("cron").value.split(" ");
var now = new Date();
var dates = [];
var count = 0;
var year = now.getFullYear();
var month = 0;
var day = 0;
var hour = 0;
var minute = 0;
var second = 0;
for (var i = 0; i < 10; i++) {
while (count < 10000) {
if (cron[5] !== "*" && cron[5] !== "?") {
var nextWeekday = getNextWeekday(year, month, day, cron[5]);
day = nextWeekday.getDate();
month = nextWeekday.getMonth();
} else if (cron[3] !== "*" && cron[3] !== "?") {
var nextDay = getNextDay(year, month, day, cron[3]);
day = nextDay.getDate();
month = nextDay.getMonth();
} else if (cron[2] !== "*" && cron[2] !== "?") {
var nextHour = getNextHour(year, month, day, hour, cron[2]);
hour = nextHour.getHours();
day = nextHour.getDate();
month = nextHour.getMonth();
} else if (cron[1] !== "*" && cron[1] !== "?") {
var nextMinute = getNextMinute(year, month, day, hour, minute, cron[1]);
minute = nextMinute.getMinutes();
hour = nextMinute.getHours();
day = nextMinute.getDate();
month = nextMinute.getMonth();
} else if (cron[0] !== "*" && cron[0] !== "?") {
var nextSecond = getNextSecond(year, month, day, hour, minute, second, cron[0]);
second = nextSecond.getSeconds();
minute = nextSecond.getMinutes();
hour = nextSecond.getHours();
day = nextSecond.getDate();
month = nextSecond.getMonth();
} else {
var nextMonth = month + 1;
if (nextMonth > 11) {
nextMonth = 0;
year++;
}
day = 1;
month = nextMonth;
hour = 0;
minute = 0;
second = 0;
}
if (cron[4] !== "*" && cron[4] !== "?") {
if (month !== parseInt(cron[4]) - 1) {
continue;
}
}
if (dates.length === 0 || (dates.length > 0 && getTimeDiff(dates[dates.length - 1], new Date(year, month, day, hour, minute, second)) > 0)) {
dates.push(new Date(year, month, day, hour, minute, second));
break;
}
count++;
}
}
var result = document.getElementById("result");
result.innerHTML = "";
if (dates.length === 0) {
result.innerHTML = "无法计算出下10个触发时间";
} else {
result.innerHTML = "<h3>下10个触发时间:</h3><ul>";
for (var i = 0; i < dates.length; i++) {
result.innerHTML += "<li>" + formatDate(dates[i]) + "</li>";
}
result.innerHTML += "</ul>";
}
}
function getNextWeekday(year, month, day, weekday) {
var date = new Date(year, month, day);
var daysToAdd = (7 + parseInt(weekday) - date.getDay()) % 7;
date.setDate(date.getDate() + daysToAdd);
return date;
}
function getNextDay(year, month, day, targetDay) {
var date = new Date(year, month, day);
var daysToAdd = parseInt(targetDay) - date.getDate();
if (daysToAdd < 0) {
daysToAdd += getDaysInMonth(year, month);
}
date.setDate(date.getDate() + daysToAdd);
return date;
}
function getNextHour(year, month, day, hour, targetHour) {
var date = new Date(year, month, day, hour);
var hoursToAdd = parseInt(targetHour) - date.getHours();
if (hoursToAdd < 0) {
hoursToAdd += 24;
}
date.setHours(date.getHours() + hoursToAdd);
return date;
}
function getNextMinute(year, month, day, hour, minute, targetMinute) {
var date = new Date(year, month, day, hour, minute);
var minutesToAdd = parseInt(targetMinute) - date.getMinutes();
if (minutesToAdd < 0) {
minutesToAdd += 60;
}
date.setMinutes(date.getMinutes() + minutesToAdd);
return date;
}
function getNextSecond(year, month, day, hour, minute, second, targetSecond) {
var date = new Date(year, month, day, hour, minute, second);
var secondsToAdd = parseInt(targetSecond) - date.getSeconds();
if (secondsToAdd < 0) {
secondsToAdd += 60;
}
date.setSeconds(date.getSeconds() + secondsToAdd);
return date;
}
function getDaysInMonth(year, month) {
return new Date(year, month + 1, 0).getDate();
}
function getTimeDiff(date1, date2) {
return date2.getTime() - date1.getTime();
}
function formatDate(date) {
var year = date.getFullYear();
var month = addZero(date.getMonth() + 1);
var day = addZero(date.getDate());
var hour = addZero(date.getHours());
var minute = addZero(date.getMinutes());
var second = addZero(date.getSeconds());
return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;
}
function addZero(num) {
if (num < 10) {
return "0" + num;
}
return num;
}
</script>
</code></pre>
</body>
</html>
原文地址: https://www.cveoy.top/t/topic/bpWN 著作权归作者所有。请勿转载和采集!