You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:54:05