Using cron-parse lib to parse the cron expression. Cron-parse can handle with more scenarios.

This commit is contained in:
mfcar 2023-02-28 17:04:46 +00:00
parent e56164aa5a
commit 7c7a6df6e4
No known key found for this signature in database
2 changed files with 5 additions and 61 deletions

View File

@ -16,6 +16,7 @@
"@nuxtjs/axios": "^5.13.6", "@nuxtjs/axios": "^5.13.6",
"@nuxtjs/proxy": "^2.1.0", "@nuxtjs/proxy": "^2.1.0",
"core-js": "^3.16.0", "core-js": "^3.16.0",
"cron-parser": "^4.7.1",
"date-fns": "^2.25.0", "date-fns": "^2.25.0",
"epubjs": "^0.3.88", "epubjs": "^0.3.88",
"hls.js": "^1.0.7", "hls.js": "^1.0.7",
@ -36,4 +37,4 @@
"postcss": "^8.3.6", "postcss": "^8.3.6",
"tailwindcss": "^3.1.4" "tailwindcss": "^3.1.4"
} }
} }

View File

@ -1,4 +1,5 @@
import Vue from 'vue' import Vue from 'vue'
import cronParser from 'cron-parser'
Vue.prototype.$bytesPretty = (bytes, decimals = 2) => { Vue.prototype.$bytesPretty = (bytes, decimals = 2) => {
if (isNaN(bytes) || bytes == 0) { if (isNaN(bytes) || bytes == 0) {
@ -137,44 +138,8 @@ Vue.prototype.$parseCronExpression = (expression) => {
} }
Vue.prototype.$getNextScheduledDate = (expression) => { Vue.prototype.$getNextScheduledDate = (expression) => {
const cronFields = expression.split(' '); const interval = cronParser.parseExpression(expression);
const currentDate = new Date(); return interval.next().toDate()
const nextDate = new Date();
// Calculate next minute
const minute = cronFields[0];
const currentMinute = currentDate.getMinutes();
const nextMinute = getNextValue(minute, currentMinute, 59);
nextDate.setMinutes(nextMinute);
// Calculate next hour
const hour = cronFields[1];
const currentHour = currentDate.getHours();
const nextHour = getNextValue(hour, currentHour, 23);
nextDate.setHours(nextHour);
// Calculate next day of month
const dayOfMonth = cronFields[2];
const currentDayOfMonth = currentDate.getDate();
const lastDayOfMonth = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate();
const nextDayOfMonth = getNextValue(dayOfMonth, currentDayOfMonth, lastDayOfMonth);
nextDate.setDate(nextDayOfMonth);
// Calculate next month
const month = cronFields[3];
const currentMonth = currentDate.getMonth() + 1;
const nextMonth = getNextValue(month, currentMonth, 12);
nextDate.setMonth(nextMonth - 1);
// Calculate next day of week
const dayOfWeek = cronFields[4];
const currentDayOfWeek = currentDate.getDay();
const nextDayOfWeek = getNextValue(dayOfWeek, currentDayOfWeek, 6);
const daysUntilNextDayOfWeek = getNextDaysUntilDayOfWeek(currentDate, nextDayOfWeek);
nextDate.setDate(currentDate.getDate() + daysUntilNextDayOfWeek);
// Return the next scheduled date
return nextDate;
} }
export function supplant(str, subs) { export function supplant(str, subs) {
@ -186,25 +151,3 @@ export function supplant(str, subs) {
} }
) )
} }
function getNextValue(cronField, currentValue, maxValue) {
if (cronField === '*') {
return currentValue + 1 <= maxValue ? currentValue + 1 : 0;
}
const values = cronField.split(',');
const len = values.length;
let nextValue = parseInt(values[0]);
for (let i = 0; i < len; i++) {
const value = parseInt(values[i]);
if (value > currentValue) {
nextValue = value;
break;
}
}
return nextValue <= maxValue ? nextValue : parseInt(values[0]);
}
function getNextDaysUntilDayOfWeek(currentDate, nextDayOfWeek) {
const daysUntilNextDayOfWeek = (nextDayOfWeek + 7 - currentDate.getDay()) % 7;
return daysUntilNextDayOfWeek === 0 ? 7 : daysUntilNextDayOfWeek;
}