Spring Boot中用@Scheduled实现UTC时间每小时01分执行任务
Spring Boot中使用@Scheduled实现UTC时间每小时01分执行任务
正确的Cron表达式及时区配置
要实现UTC时间的00:01、01:01、02:01等每小时整点过1分执行任务,对应的Cron表达式为:0 1 * * * ?,同时必须指定UTC时区——否则Spring Boot会默认使用系统本地时区,导致触发时间不符合要求。
你可以通过两种方式指定时区:
- 直接在
@Scheduled注解中配置zone属性 - 全局配置所有定时任务使用UTC时区
具体实现步骤
1. 开启定时任务支持
在Spring Boot启动类上添加@EnableScheduling注解,启用定时任务功能:
@SpringBootApplication @EnableScheduling public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
2. 编写定时任务组件
创建一个Spring组件类,在任务方法上添加@Scheduled注解,指定Cron表达式和UTC时区:
@Component public class HourlyScheduledTask { @Scheduled(cron = "0 1 * * * ?", zone = "UTC") public void runHourlyTask() { // 这里编写你的任务逻辑 System.out.println("任务执行(UTC时间):" + Instant.now()); } }
3. 全局配置UTC时区(可选)
如果你的项目中有多个定时任务都需要使用UTC时区,可以在application.properties或application.yml中全局配置:
# application.properties spring.scheduled.cron.zone=UTC
配置后,@Scheduled注解中可以省略zone属性,直接写Cron表达式即可:
@Scheduled(cron = "0 1 * * * ?") public void runHourlyTask() { // 任务逻辑 }
表达式说明
0 1 * * * ? 的含义拆解:
0:秒位,指定第0秒执行1:分位,指定第1分钟执行*:小时位,任意小时都触发*:日期位,任意日期都触发*:月份位,任意月份都触发?:星期位,不指定星期(避免与日期位冲突,因为我们已经指定了任意日期)
内容的提问来源于stack exchange,提问作者Vibhu Upamanyu
相关产品推荐
相关产品推荐

