文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

聊聊当业务数据时间和预期的不一样,可以从哪些方向排查

2024-12-03 04:20

关注

[[403163]]

今天就这个问题,来做个复盘,来聊聊当业务数据时间和预期的不一样,可以从哪些方向排查

排查方向

1、数据库和服务器的时间不一致

1、查看jdbc链接配置的时区,即serverTimezone的参数配置

注: 本文的时区都以东八区为基准,且数据库为mysql

示例:

  1. jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC 

如上图配置的时区是UTC,这样就和东八区相差8个小时。如果按这种配法,当我们在代码层采用new Date()的方式,则落到数据库的时间会比我们预期的时间相差8个小时。此时我们可以把jdbc上配置的时区参数改成

  1. serverTimezone=Asia/Shanghai 

2、查看数据库默认的时区配置

  1. show variables like '%time_zone%'

 

由图可以看出,此时数据库时区默认配置不是东八区。我们可以通过如下方法进行修改

a、通过命令

 

  1. ##修改mysql全局时区为东八区 
  2. set global time_zone = '+8:00';  
  3.  ##修改当前会话时区 
  4. set time_zone = '+8:00'

注: 通过命令行,无需重启mysql服务,但当mysql服务再次被重启,则上面的配置就会消失

b、通过配置文件

linux系统则编辑my.cnf ,填入如下内容

 

  1. [mysqld] 
  2. // 设置默认时区 
  3. default-time_zone='+8:00' 

window的系统则编辑my.ini,填入的内容和linux一样

注: 修改完配置后,需要重启mysql服务

业务部门的创建时间相差8个小时,就是因为他们业务的创建时间统一是通过数据库配置默认时间,当时他们数据库默认时区是UTC,因此相差了8个小时。后来通过调整数据库时区解决这个问题

2、容器和服务器的时间不一致

1、进入容器内部查看时间

  1. docker exec -it 【容器ID或者NAME】 bin/bash -c date 

2、如果是容器是已经生成

可以直接把宿主机的localtime拷贝到docker容器中,前提是宿主机的时间也是对的。命令如下

  1. docker cp /etc/localtime 【容器ID或者NAME】:/etc/localtime 

或者直接修改docker容器的时间也可以。进入容器内容,执行date -s

3、容器生成前,直接通过dockerfile配置【推荐】

 

  1. FROM adoptopenjdk/openjdk8 
  2. VOLUME /tmp 
  3. #ENV JAVA_OPTS="-Dcom.sun.management.jmxremote.port=39083 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" 
  4. ENV JAVA_OPTS="" 
  5. COPY localtime /etc/localtime 
  6. RUN echo "Asia/Shanghai" > /etc/timezone 
  7. COPY demo-biz/target/demo-service-biz-*.jar app.jar 
  8. ENTRYPOINT [ "sh""-c""exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ] 

注: 因业务的dockerfile是统一根据模板生成,因此就没这个问题

3、时间格式配置不正确

业务部门为了统一处理时间格式,在代码中做了如下配置

 

  1. @Configuration 
  2. public class WebConfig implements WebMvcConfigurer { 
  3.     @Override 
  4.     public void configureMessageConverters(List> converters) { 
  5.         FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); 
  6.         //格式化json数据格式 
  7.         FastJsonConfig fastJsonConfig = new FastJsonConfig(); 
  8.         //序列化时避免精度丢失,转换为字符串 
  9.         SerializeConfig serializeConfig = SerializeConfig.globalInstance; 
  10.         serializeConfig.put(BigInteger.class, ToStringSerializer.instance); 
  11.         serializeConfig.put(Long.class, ToStringSerializer.instance); 
  12.         serializeConfig.put(Long.TYPE, ToStringSerializer.instance); 
  13.  
  14.         fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue); 
  15.         fastJsonConfig.setSerializeConfig(serializeConfig); 
  16.         fastJsonConfig.setDateFormat("yyyy-HH-dd HH:mm:ss"); 
  17.         fastConverter.setFastJsonConfig(fastJsonConfig); 
  18.  
  19.         List fastMediaTypes = new ArrayList<>(); 
  20.         fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); 
  21.         fastMediaTypes.add(MediaType.APPLICATION_JSON); 
  22.         fastConverter.setSupportedMediaTypes(fastMediaTypes); 
  23.  
  24.         converters.add(0,fastConverter); 
  25.     } 
  26.  
  27.  

眼尖的朋友,可能发现了那个时间格式,长得和正常的格式是不一样的。谁能想到,那个奇葩的bug,竟然是因为不小心把时间格式写错了。解决的方法就很简单了,

  1. fastJsonConfig.setDateFormat("yyyy-HH-dd HH:mm:ss"); 

改成

  1. fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss"); 

总结

上面就介绍几种排查方向,尤其是最后一种,因为时间格式写错,导致时间显示错误

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯