这是啥BUG啊(三)

今天是美好的一天,先把上周五部署测试环境的定时任务功能看看,呦西!定时任务都顺利的执行成功了。

就都麻袋!我定的是23点执行,怎么成15点执行了?

看看cron表达式 0 2 23 * * ?

没毛病啊!为啥会成为15点呢?

豆包一下!

时区不匹配(最高概率)

 

场景

 
服务器 / 容器 JVM 时区、数据库时区、系统时区不是东八区(Asia/Shanghai)
 
  • 你的业务按北京时间东八区配置 Cron 23,但服务运行在 UTC 零时区
     
    UTC 23:59 = 北京时间次日 07:59(不对)
     
    反过来:服务时区是东四区 / 西八区
     
    举例:
     
    系统时区 UTC-8(美西时间):
     
    服务内部的 23 = UTC-8 23:59 → 北京时间 次日15:59
     
    完全吻合你看到的 15:59:00

 

时区问题?先打个日志看看

// 打印当前JVM时区ID System.out.println("JVM默认时区:" + TimeZone.getDefault().getID()); // JDK8+新版写法 System.out.println("系统默认ZoneId:" + ZoneId.systemDefault());

先本地执行一下,没问题的,之间是东八区的。

没准是测试环境的特殊情况,群里通告一下测试们,打包!部署!

卧槽了,日志还是东八区的时间,没问题啊

看看是不是数据库的链接设定的时区问题

-- 数据库服务器操作系统时间 SELECT SYSDATE FROM DUAL; -- 带时分秒 SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') DB_TIME FROM DUAL;-- 当前会话时区 SELECT SESSIONTIMEZONE FROM DUAL; -- 数据库实例全局时区 SELECT DBTIMEZONE FROM DUAL;

全都是东八区,我特么!

最后的办法!给  prop.put("org.quartz.scheduler.timeZoneId", "Asia/Shanghai");写死了就用东八区的

我跪了,显示的时间还是UTC的,

唉?等等,数据库里面的执行时间是东八区的,为啥在页面就是UTC的呢?

后端打断点,前端也是!

我尼玛,后端返回的是23点,前端接收的是15点,见鬼了!

问豆包!核心原因:JSON 序列化时日期自动转 UTC 时间戳!

哦吼?我看看,

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

private Date fireTime;

这下我知道了!

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")

private Date fireTime;

项目启动!OK,解决了!

posted @ 2026-07-14 10:14  蓝海的bug本  阅读(13)  评论(0)    收藏  举报