cron表达式怎么写对?这个Java工具类4个方法含触发预演

简介: 这是一个专为Spring生态设计的Cron表达式工具类,支持语法校验、单次/多次触发时间预演,严格兼容6段Spring格式(秒分时日月周),基于`CronExpression`实现,需JDK17+与Spring Boot 3.x。

📋 目录

一、工具类功能

校验 cron 表达式语法是否合法、算出从某个时刻起下一次什么时候触发、预演接下来 N 次的触发时间,只收 Spring 的 6 段表达式,基于 CronExpression 实现。

二、所需环境

JDK 17或以上 + Spring Boot 3.x或以上

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
</dependency>

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

三、方法与调用示例(按需调用)

🔢 方法序号:1

🎯 方法用途:

  • 判断一句 cron 表达式是否合法,只给布尔不抛异常
  • 任务配置入库前的校验、管理后台的实时提示用这个入口

🧩 方法定义:public static boolean isValid(String cron)

🗣️ 入参解释:public static boolean isValid(cron表达式)

📤 返回值解释:boolean,能被 Spring 解析就返回 true

💡 边界口径:

  • 只接受 Spring 风格的 6 段(秒 分 时 日 月 周),?、L、W、# 以 Spring 实现为准
  • 5 段的 Unix cron 与 7 段的 Quartz 写法都判 false
  • null、空白、语法错误一律 false,不抛异常,适合直接贴在表单校验里
  • 校验通过不代表还会触发,日期型表达式可能永远落不到有效日

🧪 方法示例:

  • 每天 3 点、工作日 6 点半、每月最后一天 6 点半、第二个周一 8 点四种写法都拿到 true
  • 少一段的 5 段写法拿到 false
  • 秒位越界的表达式拿到 false
  • 空白与 null 都拿到 false,不抛异常
  • 上面几种非法写法用它判都是 [false, false, false]

🔢 方法序号:2

🎯 方法用途:

  • 从指定基准时间算下一次触发时刻,结果沿用基准所在时区
  • 调度页面上「下次执行时间」这类预演、以及验证表达式写得对不对时用

🧩 方法定义:public static Optional<ZonedDateTime> nextExecution(String cron, ZonedDateTime from)

🗣️ 入参解释:public static Optional<ZonedDateTime> nextExecution(cron表达式, 起始时间)

📤 返回值解释:Optional<ZonedDateTime>,永不再触发时为空

💡 边界口径:

  • 「下一次」不含基准时刻本身,基准正好压在触发点上取的是再下一个
  • 同一句表达式在 UTC 与东八区得到不同瞬间,本地钟点相同
  • 日期不存在(2 月 30 日)时返回空 Optional,不抛异常
  • 表达式为 null 或空白、基准为 null 抛 IllegalArgumentException,消息带上原始表达式与 Spring 的原因

🧪 方法示例:

  • 从 2026-01-01T00:00(Asia/Shanghai, 2025-12-31T16:00:00Z) 起,每天 3 点的下一次是 2026-01-01T03:00(Asia/Shanghai, 2025-12-31T19:00:00Z)
  • 基准正好压在触发点上时,2026-01-01T03:00(Asia/Shanghai, 2025-12-31T19:00:00Z) 得到的是 2026-01-02T03:00(Asia/Shanghai, 2026-01-01T19:00:00Z)
  • 同一句表达式换 UTC 基准,拿到 2026-01-01T03:00(UTC, 2026-01-01T03:00:00Z),本地钟点相同但瞬间不同
  • 2 月 30 日不存在这种表达式拿到 Optional.empty

🔢 方法序号:3

🎯 方法用途:

  • 不传基准,按此刻与 JVM 默认时区算下一次触发
  • 服务端本机调度、只想看「接下来什么时候跑」时用这一版

🧩 方法定义:public static Optional<ZonedDateTime> nextExecution(String cron)

🗣️ 入参解释:public static Optional<ZonedDateTime> nextExecution(cron表达式)

📤 返回值解释:Optional<ZonedDateTime>,永不再触发时为空

💡 边界口径:

  • 基准取 ZonedDateTime.now(),服务器时区不同结果不同,跨时区部署要显式传基准
  • 判定与不含基准的语义同两参版,仍不含当前瞬间本身
  • 表达式为 null 或空白抛 IllegalArgumentException

🧪 方法示例:

  • 每分钟的表达式 nextExecution("0 * * * * *") 不传基准,拿到 2026-10-13T12:01(Asia/Shanghai, 2026-10-13T04:01:00Z)
  • 表达式传空白串抛 cron表达式不能为空

🔢 方法序号:4

🎯 方法用途:

  • 一次算出接下来若干次触发时刻,返回严格递增的列表
  • 排班预览、给运维看「今天还会跑哪几次」这类界面用它

🧩 方法定义:public static List<ZonedDateTime> nextExecutions(String cron, ZonedDateTime from, int count)

🗣️ 入参解释:public static List<ZonedDateTime> nextExecutions(cron表达式, 起始时间, 次数)

📤 返回值解释:List<ZonedDateTime>,按时间严格递增,可能少于 count

💡 边界口径:

  • 表达式提前失效(永不再触发)时实际数量可以少于 count,不补空位
  • 第一个元素与 nextExecution 的结果一致,两个入口口径打通
  • count 不大于 0 抛 IllegalArgumentException,消息带上实际值
  • 时区与基准语义与两参版完全相同

🧪 方法示例:

  • 每天 3 点取 5 次,拿到 [2026-01-01T03:00(Asia/Shanghai, 2025-12-31T19:00:00Z), 2026-01-02T03:00(Asia/Shanghai, 2026-01-01T19:00:00Z), 2026-01-03T03:00(Asia/Shanghai, 2026-01-02T19:00:00Z), 2026-01-04T03:00(Asia/Shanghai, 2026-01-03T19:00:00Z), 2026-01-05T03:00(Asia/Shanghai, 2026-01-04T19:00:00Z)]
  • 每 10 分钟取 3 次,列表严格递增且第一个与方法2 一致,判断拿到 true
  • 永不再触发的表达式拿到 0 个,数量少于要求的次数
  • Quartz 的 7 段写法抛 cron表达式非法: 0 0 0 1 1 ? 2026(Spring 只支持 6 段表达式,Quartz 的第 7 段年份需去掉), 原因: Cron expression must consist of 6 fields (found 7 in "0 0 0 1 1 ? 2026")
  • 次数传 0 抛 次数必须大于0,当前为0,起始时间传 null 抛 起始时间不能为null

四、工具类源码(可直接复制)

📦 源码文件

相关文章
|
定位技术 数据中心
全球历史台风轨迹数据的艰难寻找经历
全球历史台风轨迹数据的艰难寻找经历
3492 0
|
4月前
|
Arthas SQL Java
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
Arthas ognl 表达式:不重启 JVM 就能访问任意对象、调用任意方法。从零讲透 OGNL 语法与 Arthas ognl 命令实战
Arthas ognl 表达式从入门到实战:掌握在线调试最强的表达式引擎
|
3月前
|
传感器 人工智能 运维
Geo专家于磊:GEO优化里被忽略的关键细节
本文聚焦GEO(生成式引擎优化)中易被忽视却至关重要的十大细节:引用可追溯性、术语锚定、经验显式化、边界正面化、数字口径化、语义覆盖、首句命中、时效标注、人味表达与跨模态信号。普林斯顿等研究证实,落实这些细节可使内容被AI采纳率提升约40%——细节不是修饰,而是决定是否入答案的分水岭。
244 1
|
5月前
|
人工智能 自然语言处理 算法
职场人转型AI,先找到原岗位和AI的结合点
2026年职场人转型AI,无需辞职重学!关键在于“原岗位+AI”融合:用熟悉业务场景(如HR简历筛选、运营内容生成、财务票据识别)作为AI落地切口,将经验升级为“AI能力放大器”。推荐考取CAIE认证——聚焦应用、零基础友好、企业认可度高,助你稳扎稳打成为懂业务、会工具、能落地的复合型数智人才。
|
机器学习/深度学习 PyTorch 测试技术
从训练到推理:Intel Extension for PyTorch混合精度优化完整指南
PyTorch作为主流深度学习框架,凭借动态计算图和异构计算支持,广泛应用于视觉与自然语言处理。Intel Extension for PyTorch针对Intel硬件深度优化,尤其在GPU上通过自动混合精度(AMP)提升训练与推理性能。本文以ResNet-50在CIFAR-10上的实验为例,详解如何利用该扩展实现高效深度学习优化。
666 0
|
机器学习/深度学习 人工智能 算法
AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
 AI-Compass RLHF人类反馈强化学习技术栈:集成TRL、OpenRLHF、veRL等框架,涵盖PPO、DPO算法实现大模型人类价值对齐
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
951 0
|
网络协议 算法 JavaScript
快手虚拟ip地址永久免费版分享
虚拟IP技术原理与实现方案 1. 虚拟IP核心概念
|
运维 Ubuntu Linux
Linux系统之ncdu命令的基本使用
【8月更文挑战第8天】Linux系统之ncdu命令的基本使用
643 2
Linux系统之ncdu命令的基本使用
|
并行计算 IDE 物联网
开源代码大模型CodeFuse
蚂蚁集团在2023外滩大会上开源了自研代码生成模型CodeFuse,提供智能代码建议和实时支持,评测得分超越GPT-4和WizardCoder-34B。CodeFuse适用于开发助手、IDE插件等场景,现已在魔搭社区开放下载与体验,包括CodeFuse13B-4K和CodeFuse-CodeLlaMa34B-MFT两个版本,以及配套数据集CodeExercise-Python-27k和Evol-instruction-66k。
885 2