如何配置Firebase云函数从午夜00:00开始每90分钟执行一次
如何配置Firebase云函数从午夜00:00开始每90分钟执行一次
我明白你的需求啦——要让Firebase云函数从每天午夜00:00准时启动,之后每90分钟执行一次,而不是部署后立刻开始跑对吧?之前用every 90 minutes的问题在于,它会从部署完成的时间开始计时循环,没法等到午夜才启动,而你试的那些cron表达式也没命中正确的时间点。
其实这个需求可以通过拆分cron表达式来实现,因为90分钟的间隔刚好可以拆成两个3小时循环的序列:一个是每3小时的整点(00:00、03:00...),另一个是每3小时的半点但偏移1小时(01:30、04:30...),把这两个序列组合起来,就完美覆盖了你要的每90分钟一次的时间点,而且从午夜开始。
方案一:合并cron表达式到单个调度函数
Firebase的Pub/Sub调度支持用逗号分隔多个cron表达式,这样可以在同一个函数里实现两个时间序列的调度:
exports.scheduledFunction = functions.pubsub.schedule("0 */3 * * *, 30 1/3 * * *") .timeZone('Asia/Riyadh') .onRun(async (context) => { // 在这里编写你的业务逻辑 console.log('函数执行中,当前沙特时间:', new Date().toLocaleString('zh-CN', {timeZone: 'Asia/Riyadh'})); return null; });
解释一下这两个表达式:
0 */3 * * *:表示每天每3小时的0分执行一次,对应时间点是00:00、03:00、06:00……30 1/3 * * *:表示从每天1点开始,每3小时的30分执行一次,对应时间点是01:30、04:30、07:30……
两者组合后,就会从午夜00:00开始,每90分钟执行一次,完全符合你的需求。
方案二:拆分两个调度函数指向同一逻辑
如果你需要更灵活地调整每个调度的配置(比如单独设置日志级别、超时时间),可以把两个调度分开写,都调用同一个处理函数:
// 定义共享的业务处理逻辑 const runMyScheduledTask = async () => { // 这里写你的核心业务代码 console.log('定时任务执行成功'); // 记得返回Promise或者处理异步逻辑 return Promise.resolve(); }; // 调度1:每3小时整点执行(00:00、03:00...) exports.taskOnHour = functions.pubsub.schedule("0 */3 * * *") .timeZone('Asia/Riyadh') .onRun(runMyScheduledTask); // 调度2:每3小时半点偏移1小时执行(01:30、04:30...) exports.taskOnHalfHour = functions.pubsub.schedule("30 1/3 * * *") .timeZone('Asia/Riyadh') .onRun(runMyScheduledTask);
关键注意点
一定要确保设置了正确的时区Asia/Riyadh,否则调度的时间会按照Firebase默认的UTC时间计算,导致午夜的时间点不符合预期。
备注:内容来源于stack exchange,提问作者mazenqp
相关产品推荐
相关产品推荐

