代码如下:
// 配置:在此处修改你的任务列表
const TASK_CONFIG = {
// === 独立的小时任务 ===
'ff-12': { name: 'access-url-ff', url: 'http://****.cn/' },
'zk-24': { name: 'access-url-zk', url: 'http://****.cn/' }
// === 原有其他复合任务组 ===
// 每12小时执行的任务(在北京时间8点和20点的0分执行)
'0-12': [
{ name: 'access-url-md', url: 'http://****.cn/' },
{ name: 'access-url-sw', url: 'http://****.cn/' }
],
// 每2小时的第5分钟执行的任务
'5-2': [
{ name: 'access-url-ol1', url: 'http://****.cn/' }
],
// 每2小时的第20分钟执行的任务
'20-2': [
{ name: 'access-url-ol2', url: 'http://****.cn/' }
],
// 每2小时的第35分钟执行的任务
'35-2': [
{ name: 'access-url-ol3', url: 'http://****.cn/' }
],
// 每2小时的第50分钟执行的任务
'50-2': [
{ name: 'access-url-ol4', url: 'http://****.cn/' }
],
// 每天凌晨1:30执行的任务 (现在是北京时间1:30)
'30-1': [
{ name: 'daily-tv-dy', url: 'http://****.cn/' },
{ name: 'daily-api-sql', url: 'http://****.cn/' }
]
};
// 主处理函数:判断时间并执行对应任务
async function handleScheduledEvent() {
const now = new Date();
// === 核心修改:UTC时间转换为北京时间(UTC+8)===
const utcHour = now.getUTCHours();
const utcMinute = now.getUTCMinutes();
// 计算北京时间的小时和分钟
let bjHour = utcHour + 8;
const bjMinute = utcMinute; // 分钟不变
// 处理跨日(超过24点)
if (bjHour >= 24) {
bjHour = bjHour - 24;
}
// 注意:此简化逻辑未处理bjHour可能为负数的情况(如果时区是UTC-),但对我们(+8)是安全的。
const tasksToRun = [];
console.log(`[调度检查] 北京时间: ${bjHour}:${bjMinute.toString().padStart(2, '0')}`);
// 判断并收集当前分钟需要运行的所有任务
// 2. 处理“独立小时任务” (格式如 "ff-12") - 基于北京时间
for (const [key, taskConfig] of Object.entries(TASK_CONFIG)) {
if (key === '*/10' || Array.isArray(taskConfig)) {
continue;
}
if (key.includes('-')) {
const parts = key.split('-');
if (parts.length === 2 && !isNaN(parts[1])) {
const taskMinute = parseInt(parts[1], 10);
// 判断北京时间的分钟数
if (bjMinute === taskMinute) {
tasksToRun.push(taskConfig);
}
}
}
}
// 3. 处理“每N小时”型复合任务组(需同时满足分钟和小时条件)- 基于北京时间
for (const [key, tasks] of Object.entries(TASK_CONFIG)) {
if (Array.isArray(tasks) && key.includes('-') && key.split('-').length === 2) {
const [targetMinute, hourInterval] = key.split('-').map(Number);
if (!isNaN(targetMinute) && !isNaN(hourInterval)) {
// 关键:判断逻辑基于北京时间 (bjMinute, bjHour)
if (bjMinute === targetMinute && bjHour % hourInterval === 0) {
tasksToRun.push(...tasks);
}
}
}
}
// 执行所有收集到的任务
if (tasksToRun.length > 0) {
console.log(`即将执行 ${tasksToRun.length} 个任务`);
for (const task of tasksToRun) {
await executeTask(task);
}
console.log('所有任务执行完毕');
} else {
console.log('当前时间无预定任务');
}
}
// 执行单个任务:访问URL (保持不变)
async function executeTask(task) {
const startTime = Date.now();
try {
console.log(`开始任务: ${task.name}`);
const response = await fetch(task.url, {
signal: AbortSignal.timeout(10000)
});
const duration = Date.now() - startTime;
if (response.ok) {
console.log(`成功: ${task.name} (${duration}ms)`);
} else {
console.log(`警告: ${task.name} 返回状态 ${response.status} (${duration}ms)`);
}
} catch (error) {
const duration = Date.now() - startTime;
console.log(`失败: ${task.name} - ${error.name || 'Error'} (${duration}ms)`);
}
}
// Workers 调度事件监听器(必须保留)
addEventListener('scheduled', event => {
event.waitUntil(handleScheduledEvent());
});
在workers设置里面
触发事件新增触发器,每一分钟执行一次