学生做网站作品图片,在线智能识图,寿光市建设局网站,手机网站微信登录接口1、背景 一个活动#xff0c;需要按照自然月刷新#xff0c;每月一期#xff0c;以活动开始当月作为第一期#xff0c;每期可配置不同数据。问题出现在#xff1a;活动开始时间为本月#xff0c;但是查询用户数据发现当前为第二期#xff0c;反复查看代码#xff0c;确…1、背景 一个活动需要按照自然月刷新每月一期以活动开始当月作为第一期每期可配置不同数据。问题出现在活动开始时间为本月但是查询用户数据发现当前为第二期反复查看代码确定计算期数逻辑无问题十分诡异。期数计算代码如下
protected int getPeriod(Date begin, Date now) {// DateUtil为工具类format方法将时间转化为 yyyy-MM-dd格式String beginTime DateUtil.format(begin, DateUtil.FORMATTER_YYYYMMDD_STR);String nowTime DateUtil.format(now, DateUtil.FORMATTER_YYYYMMDD_STR);int beginYear Integer.valueOf(beginTime.substring(0, 4));int nowYear Integer.valueOf(nowTime.substring(0, 4));int beginMonth (beginTime.charAt(5) - 0) * 10 (beginTime.charAt(6) - 0);int nowMonth (nowTime.charAt(5) - 0) * 10 (nowTime.charAt(6) - 0);// 计算期数可能出现跨年需要考虑年份return nowMonth 12 * (nowYear - beginYear) - beginMonth 1;}2、排查 服务为分布式架构有多个节点发现只有少数节点会产生异常数据本次活动只配置了一期计算结果为第二期时会因拿不到配置数据而空指针根据报错日志判断。查看配置数据发现活动开始时间为本月1日00点00分00秒因此数个小时的时差即会导致月份出现偏差猜测服务器时区问题date -R检查服务器时区正常节点与异常节点时区一致暂时不考虑时区问题。 配置数据会加载进内存当修改配置数据时会修改有改动表的版本号定时任务根据表版本号去刷新配置。考虑是配置人员中途改过数据定时任务出现问题导致配置没有更新。观察日志发现刷新配置的时间异常时区与机器时区不一致。 date -R 结果0900 东九区 Wed, 12 Jun 2024 22:59:25 0900 服务器日志时间
2024-06-12T01:17:22.50600003、结论 出现错误的原因为进程时区与数据库时区没有保持一致导致进程内时间与实际要配置的时间出现偏差最终导致计算出错。
4、总结 1临界点时间跨天、跨月、跨年极易受时区影响导致极大误差出现时间问题时可第一时间查看时区问题 2机器时区与进程时区并不总是一致需要摆脱这个惯性思维用其他方式如日志确定进程时区。