Cron表达式是什么?
Cron表达式是一种时间描述语法,源自Unix的cron守护进程。它用一组字段描述时间规则,告诉系统"什么时候执行任务"。从Linux服务器的定时备份,到Spring Boot的定时任务,再到Kubernetes的CronJob,Cron表达式是定时任务的事实标准。
Cron表达式语法
标准的5字段Cron格式为:分 时 日 月 周。6字段格式(Quartz/Spring)增加了秒:秒 分 时 日 月 周。每个字段可以使用的特殊字符:
- *:任意值(每分/每时/每日)
- ,:列举值(1,3,5表示1、3、5)
- -:范围(1-5表示1到5)
- /:步长(*/5表示每5单位,0/5表示从0开始每5单位)
- ?:不指定(仅日和周字段可用,用于冲突时二选一)
- L:最后(L表示月末,6L表示最后一个周五)
- W:最近工作日(15W表示离15号最近的工作日)
10个最常用的Cron表达式
- 每分钟执行:* * * * * 或 0 * * * * *
- 每小时整点:0 * * * * 或 0 0 * * * *
- 每天零点:0 0 * * * 或 0 0 0 * * *
- 每天早上8点:0 8 * * * 或 0 0 8 * * *
- 每周一早上9点:0 9 * * 1 或 0 0 9 ? * 1
- 每月1号零点:0 0 1 * * 或 0 0 0 1 * ?
- 每5分钟:*/5 * * * * 或 0 */5 * * * *
- 工作日早上9点:0 9 * * 1-5 或 0 0 9 ? * 2-6
- 每季度第一天:0 0 1 1,4,7,10 * 或 0 0 0 1 1,4,7,10 ?
- 每年1月1日零点:0 0 1 1 * 或 0 0 0 1 1 ?
日和周的冲突问题
这是Cron表达式中最容易出错的地方。当同时指定了"日"和"周"字段时,两个条件是"或"的关系而不是"且"的关系。如果你想要"每月15号且是周三"才执行,标准的Cron语法是无法直接表达的。解决方法是使用?号将其中一个字段设为不指定,然后在任务代码中做二次判断。
时区问题
Cron表达式不包含时区信息。在分布式系统中,不同服务器可能使用不同的时区设置。最佳实践是在Cron配置中显式指定时区(如Spring的@Scheduled注解支持zone属性),或确保所有服务器使用统一的UTC时间。
工具推荐
使用我们的在线Cron表达式生成器,可视化配置各字段,内置20+常用模板,自动计算下次执行时间,帮助你在不查文档的情况下快速写出正确的Cron表达式。