Kotlin中如何判断LocalTime.now是否为晚上9点?
LocalTime实现晚9点触发任务的解决方案
晚9点对应的时间常量为LocalTime.of(21, 0),判断当前是否符合时间点的基础写法为:LocalTime.now().truncatedTo(ChronoUnit.MINUTES).equals(LocalTime.of(21, 0))
使用truncatedTo(ChronoUnit.MINUTES)是为了截断秒、毫秒位,避免时间精度问题导致匹配失败,需提前导入java.time.temporal.ChronoUnit依赖。
不同场景的实现方案
场景1:单次触发(仅执行一次)
直接在轮询逻辑中加入上述时间判断即可,匹配成功后执行目标操作、终止轮询。
场景2:原生Java常驻程序每天触发
使用JDK自带的ScheduledExecutorService实现周期性调度:
- 先计算当前时间到下一个21点的初始延迟
- 首次执行后每间隔24小时触发一次
示例代码:
// 初始化调度器 ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); LocalTime targetTime = LocalTime.of(21, 0); // 计算初始延迟 long initialDelay = Duration.between(LocalTime.now(), targetTime).toMillis(); // 若当前已过今日21点,初始延迟加1天 if (initialDelay < 0) { initialDelay += Duration.ofDays(1).toMillis(); } // 提交调度任务 scheduler.scheduleAtFixedRate(() -> { // 此处写入需要执行的操作逻辑 }, initialDelay, Duration.ofDays(1).toMillis(), TimeUnit.MILLISECONDS);
场景3:SpringBoot项目每天触发
无需手动实现调度逻辑,两步即可完成:
- 启动类添加
@EnableScheduling注解开启调度能力 - 目标方法上添加
@Scheduled(cron = "0 0 21 * * ?")注解,程序运行后会自动在每天晚9点执行对应方法
注意事项
- 时区兼容:
LocalTime.now()默认读取系统所在时区,如需指定时区可改为LocalTime.now(ZoneId.of("Asia/Shanghai")),避免跨时区部署时触发时间偏差 - 漏触发规避:如果对触发精度要求不高,建议用时间区间判断替代精确等于,比如判断当前时间是否在21:00到21:01区间,避免程序卡顿、调度抖动导致的时间点漏匹配
内容的提问来源于stack exchange,提问作者Zupermar
相关产品推荐
相关产品推荐

