当前位置: 首页 > 科技观察

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

时间:2023-03-20 01:05:19 科技观察

前言前几天,业务部的开发同事遇到了一个奇怪的bug。首先,他们在业务入库时的创建时间和服务器时间相差8小时。其次,这个时间在前端显示的时候,这个时间其实和服务时间相差了好几个月。今天我们就这个问题做一个回顾,说说业务数据的时间和预期的不一样的时候,可以从哪些方向去查,去查。1、数据库和服务器的时间不一致。1.查看jdbc链接配置的时区,即serverTimezone参数配置注意:本文时区以东八区为准,数据库为mysql示例:jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC上图中配置的时区是UTC,这样就和东八区有8小时的时差。按照这种匹配方式,当我们在代码层使用newDate()方法时,落入数据库的时间会比我们预期的时间晚8个小时。这时我们可以将jdbc上配置的时区参数修改为serverTimezone=Asia/Shanghai2,查看数据库默认时区配置showvariableslike'%time_zone%';从图中可以看出,数据库默认的时区配置不是东八区。我们可以通过以下方法对其进行修改使用命令##修改mysql的全球时区为东八区setglobaltime_zone='+8:00';##修改当前会话时区settime_zone='+8:00';注意:通过命令行,不需要重启mysql服务,但是再次重启mysql服务后,上面的配置就会消失b、通过配置文件linux系统,编辑my.cnf,填写以下内容[mysqld]//设置默认时区default-time_zone=对于'+8:00'窗口系统,编辑my.ini,填写与linux相同的内容。注意:修改配置后需要重启mysql服务。统一就是通过数据库配置默认时间。当时他们数据库默认的时区是UTC,所以有8小时的时差。后来通过调整数据库的时区解决了这个问题。2.容器和服务器的时间不一致。1、进入容器查看时间dockerexec-it[containerIDorNAME]bin/bash-cdate2.如果容器已经生成,可以直接将宿主机本地时间复制到docker容器中,前提是宿主机的时间也正确。命令如下dockercp/etc/localtime[containerIDorNAME]:/etc/localtime或者直接修改docker容器的时间。进入容器内容,执行date-s3,在容器生成前直接通过dockerfile配置【推荐】FROMadoptopenjdk/openjdk8VOLUME/tmp#ENVJAVA_OPTS="-Dcom.sun.management.jmxremote.port=39083-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false"ENVJAVA_OPTS=""COPYlocaltime/etc/localtimeRUNecho"Asia/Shanghai">/etc/timezoneCOPYdemo-biz/target/demo-service-biz-*.jarapp。jarENTRYPOINT["sh","-c","execjava$JAVA_OPTS-Djava.security.egd=file:/dev/./urandom-jar/app.jar"]注:因为业务dockerfile统一按照模板,所以不存在这个问题3.时间格式配置不正确。为了统一处理时间格式,业务部在代码中做了如下配置@ConfigurationpublicclassWebConfigimplementsWebMvcConfigurer{@OverridepublicvoidconfigureMessageConverters(List>converters){FastJsonHttpMessageConverterfastConverter=newFastJsonHtvertpMessage(Converter);/Converter/Formatjson数据格式FastJsonConfigfastJsonConfig=newFastJsonConfig();//避免序列化时丢精度,转成stringSerializeConfigserializeConfig=SerializeConfig.globalInstance;seserializeConfig.put(BigInteger.class,ToStringSerializer.instance);serializeConfig.put(Long.class,ToStringSerializer.instance);serializeConfig.put(Long.TYPE,ToStringSerializer.instance);fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullJsonvalue);setSerializeConfig(serializeConfig);fastJsonConfig.setDateFormat("yyyy-HH-ddHH:mm:ss");fastConverter.setFastJsonConfig(fastJsonConfig);ListfastMediaTypes=newArrayList<>();fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);fastMediaTypes.add(MediaType.APPLICATION_JSON);fastConverter.setSupportedMediaTypes(fastMediaTypes);converters.add(0,fastConverter);}}眼尖的朋友可能发现了时间格式,看起来和正常格式不太一样。谁能告诉我我突然想到那个奇怪的错误是由于不小心写错了时间格式。解决方法很简单,fastJsonConfig.setDateFormat("yyyy-HH-ddHH:mm:ss");更改为fastJsonConfig.setDateFormat("yyyy-MM-ddHH:mm:ss");总结以上介绍几个检查方向,尤其是最后一个,因为时间格式写错了,导致时间显示错误