前言
前几天,业务部的开发同事遇到了一个奇怪的bug。首先,在已投入存储的业务的创建时间和服务器时间之间存在8小时的时间差。其次,当这个时间显示在前端时,它与服务时间相差几个月。今天,就这个问题,我们来回顾一下,谈谈当业务数据时间与预期不同时,我们可以检查哪个方向。
00-1010
排查方向
1.检查jdbc链接配置的时区,即serverTimezone的参数配置。注:本文时区基于东八区,数据库为mysql。
示例:
JDBC : my SQL ://localhost:3306/demo?UseUnicode=小蘑菇的真正成就=utf8 SuSE SSL=false server time zone=utc
上图配置的时区为UTC,距离东八区8小时。按照这个方法,当我们在代码层采用新的Date()方法时,登陆数据库的时间会比我们预期的晚8个小时。此时,我们可以将jdbc上配置的时区参数更改为
服务器时区=亚洲/上海
2.检查数据库的默认时区配置
显示像“%time_zone%”这样的变量;
从图中可以看出,此时数据库时区的默认配置不是东八区。我们可以通过以下方式对其进行修改。
通过命令# #将mysql全球时区更改为东部时区8
设置全局时区=' 8:00 ';
# #修改当前会话时区
设置time _ zone=' 8:00
注意:通过命令行,不需要重启mysql服务,但是当mysql服务再次重启时,上面的配置就会消失。
b、通过配置文件linux系统,编辑my.cnf并填写以下内容
[mysqld]
//设置默认时区
默认值-time_zone=' 8:00 '
Window的系统编辑my.ini,填充与linux相同的内容。
注意:修改配置后,需要重新启动mysql服务。
部门的创建时间相差8小时,只是因为他们的业务创建时间是通过数据库配置默认时间统一的。当时,他们数据库的默认时区是世界协调时,所以相差8小时。后来,通过调整数据库时区解决了这个问题。
00-1010 1.检查容器内的时间
日期
2.如果容器已经生成
您可以直接将主机的localtime复制到docker容器中,前提是主机的时间也是正确的。订单如下
docker CP/etc/local time[容器ID或名称] :/etc/localtime
或者直接修改docker容器的时间。输入容器的内容并执行日期
3.在生成容器之前,直接通过dockerfile配置[推荐]。
FROM采用openjdk/openjdk8
音量/tmp
# ENV JAVA _ OPTS='-Dcom . sun . management . JMX remote . port=39083-Dcom . sun . management . JMX remote . SSL=false-Dcom . sun . management . JMX remote . authenticate=false '
' ENV JAVA_OPTS=' '
COPY localtime /etc/localtime
运行回声'亚洲/上海'/等/时区
COPY demo-biz/target/demo-service-biz-*。jar app.jar
ENTRYPOINT [ 'sh ','-c ',' exec JAVA $ JAVA _ OPTS-Djava . security . EGD=file :/dev/。/urandom -jar /app.jar' ]
注意:因为业务的dockerfile是根据模板统一生成的,所以不存在这个问题。
1、数据库和服务器的时间不一致
业务部为了统一处理时间格式,在代码中做了如下配置。@配置
公共类WebConfig实现了WebMvcConfigurer {
@覆盖
public void configureMessageConverters(lishttpmessageconverter?转换器){ 0
fastjsonhtpmessageconverter=new fastjsonhtpmessageconverter();
//格式化json数据格式
FastJsonConfig FastJsonConfig=new FastJsonConfig();
//避免序列化时丢失精度,并将其转换为字符串。
serializen fig serializen fig=serializen fig . global instance;
serializen fig . put(BigInteger . class,ToStringSerializer . instance);
serialize fig . put(long . class,ToStringSerializer . instance);
序列化输入(长。类型,tostringserializer . instance);
fastjsonconfig . setserializer features(Serializer feature。WriteMapNullValue);
fastjsonconfig . setserialiseconfig(serialiseconfig);
fastjsonconfig . setdateformat(' yyyy-HH-DD HH :mm 3360s ');
快速转换器。setfastjsonconfig(fastjsonconfig);
list mediatype fast mediatypes=new ArrayList();
快速媒体类型.添加(媒体类型).应用程序_JSON_UTF8:
快速媒体类型.添加(媒体类型).应用程序_JSON:
快速转换器。setsupportedmediatypes(fast mediatypes);
转换器。添加(0,快速转换器):
}
}
云娥,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,陈鉴真的?陈鉴真的。吴世荣(签名),阿云bug(错误),不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不,不。张伯伦医生,
fastjsonconfig。setdateformat(' yyyy-hh-DD hh 3330mm 3330 ss ');
104;
fastjsonconfig。setdateformat(' yyyy-mm-DD hh 3330mm 3330 ss ');