You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中配置CronJob精确执行于每月最后一天?

Node.js中实现每月最后一天精确执行Cron任务的方案

你的问题在于常用的Node.js Cron库(如node-cron)大多不支持crontab的L(最后一天)扩展字符,所以直接用0 0 L * *会无效。下面提供两种可靠的解决方案:

方案1:在任务触发时校验日期(兼容现有CronJob配置)

保留你原有的Cron表达式0 0 28-31 * *,但在任务执行前添加日期校验,只有当天是当月最后一天时才执行实际逻辑:

const sendReport = new CronJob(
  "0 0 28-31 * *",
  async function () {
    const today = new Date();
    // 计算明天的日期
    const tomorrow = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);
    
    // 若明天是当月1号,说明今天是最后一天
    if (tomorrow.getDate() === 1) {
      try {
        console.log("执行月度报告任务(当月最后一天)");
        await sendMail();
      } catch (error) {
        console.error("发送报告邮件出错:", error);
      }
    } else {
      console.log("跳过任务:今日非当月最后一天");
    }
  },
  null,
  true,
  "UTC"
);

这个方法无需更换依赖,通过简单的日期判断就能适配所有月份(包括2月的平闰年情况)。

方案2:使用支持lastDayOfMonth的调度库(更简洁)

如果可以切换到node-schedule库,它支持直接配置每月最后一天,无需依赖Cron表达式的模糊匹配:

  1. 先安装依赖:
npm install node-schedule
  1. 编写调度代码:
const schedule = require('node-schedule');

const sendReport = schedule.scheduleJob({
  hour: 0,
  minute: 0,
  second: 0,
  lastDayOfMonth: true,
  tz: 'UTC'
}, async function() {
  try {
    console.log("执行月度报告任务(当月最后一天)");
    await sendMail();
  } catch (error) {
    console.error("发送报告邮件出错:", error);
  }
});

这种方式配置更直观,不需要额外的日期校验逻辑,调度器会自动判断当月最后一天并执行任务。

内容的提问来源于stack exchange,提问作者chemuel castillo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:38:23