前言前几天,业务部的开发同事遇到了一个奇怪的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
