这是啥BUG啊(三)
今天是美好的一天,先把上周五部署测试环境的定时任务功能看看,呦西!定时任务都顺利的执行成功了。
就都麻袋!我定的是23点执行,怎么成15点执行了?
看看cron表达式 0 2 23 * * ?
没毛病啊!为啥会成为15点呢?
豆包一下!
时区不匹配(最高概率)
场景
- 你的业务按北京时间东八区配置 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,解决了!
浙公网安备 33010602011771号