SpringBoot中 Jackson 日期的时区和日期格式问题解决
作者:蜀山雪松 发布时间:2021-09-06 19:37:50
1、使用场景
因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法语、英语、简体中文)。我们的项目部署环境为使用阿里云(德国)节点。以前我们项目主要用户在中国国内。一部署到德国服务器节点就出现一个问题了。数据返回的时间不对,存储的时间也有时差了。此文章仅仅与UTC标准时间与北京时间(东八区时间)作为实际例子。最后跟踪发现,如下几点原因:
1.1、数据库MySQL也是有时区的概念的。
通过如下命令可以查询MySQL的时区
show variables like "%time_zone%";
如果未做任何修改会显示如下:
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| system_time_zone | CST |
| time_zone | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
#time_zone说明mysql使用system的时区,system_time_zone说明system使用CST时区
1.2、系统时区意味着与计算机的操作系统时区相同。
以下是我们北京时间使用MySQL时区
set global time_zone = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8区
> set time_zone = '+8:00'; ##修改当前会话时区
> flush privileges; #立即生效
或者通过修改MySQL的 my.cnf配置文件来修改时区
# vim /etc/my.cnf ##在[mysqld]区域中加上
default-time_zone = '+8:00'
# /etc/init.d/mysqld restart ##重启mysql使新时区生效
1.2、SpringBoot默认的Json视图转换框架Jackson也有时区概念
Jackson日期反序列化时区问题,Jackson里 JsonFormat
的源码
/**
* Value that indicates that default {@link java.util.TimeZone}
* (from deserialization or serialization context) should be used:
* annotation does not define value to use.
*<p>
* NOTE: default here does NOT mean JVM defaults but Jackson databindings
* default, usually UTC, but may be changed on <code>ObjectMapper</code>.
*/
public final static String DEFAULT_TIMEZONE = "##default";
值,该值指示默认{@链接java.util.TimeZone}
(来自反序列化或序列化上下文)应使用:
注释未定义要使用的值。
注意:这里的默认值并不意味着JVM默认值,而是Jackson数据绑定。
默认值,通常为UTC,但可以在<code>objectmapper<code>上更改。
那个注释已经说明默认情况下会将 时区设置为UTC ,Jackson反序列化时间类型的底层实际上调用的是Java的 SimpleDateFormat#parse() 方法,而JVM中的时区则会根据你的操作系统来获取,所以JVM认为你的时区应该是 GMT+8 时区,
而要将 UTC 时区的时间转成 GMT+8 时区的时间,就会将你传进来的时间+8个小时。
2、代码实现
2.1、解决方案一下在每个带有日期地方加上注解
日期类型的字段上的 @JsonFormat
加上属性 timezone="GMT+8"
@NotNull
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
@JsonProperty("start_time")
private Date startTime;
此类方法需要在包含日期地方都加上注解属性,比较繁琐。
2.2、只需要配置一个bean实现整体修改
@Bean
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
return jacksonObjectMapperBuilder ->
jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8"));
}
参考文章:Jackson日期反序列化时区问题
2.3、使用SpringBoot的配置方式
spring.jackson.default-property-inclusion=NON_NULL
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
第一个设置就是使用24小时的时间格式;第二个设置就是设置时区为东八区。
但是配置时候需要注意
Finally, if you opt out of the Spring Boot default MVC configuration by providing your own @EnableWebMvc configuration, you can take control completely and do everything manually by using getMessageConverters from WebMvcConfigurationSupport.
《Spring Boot Reference Guide》
需要去掉
@EnableWebMvc
参考文章:
SpringBoot升级指定jackson版本的问题
SpringBoot利用jackson格式化时间的三种方法
java如何利用FastJSON、Gson、Jackson三种Json格式工具自定义时间序列化
3、成果展现
经过转换配置转换之后;能够正确的获得和存取对应的时间,建议使用
2.2、只需要配置一个bean实现整体修改 或者使用 2.3、使用SpringBoot的配置方式 方式比较通用性。
其中如果使用FastJson转换也可能遇见同样的问题,可以参考文章
springmvc fastjson 反序列化时间格式化方法(推荐)
4、总结
在SpringBoot开发应用之中设计日期转换需要特别注意,能够主要目标能够是的存储和返回的日期能够对应上自己的本地时区。同时能够使用较为通用的转换方式解决相关问题。
来源:https://blog.csdn.net/jianxia801/article/details/89741073


猜你喜欢
- package com.smart.frame.task.autoTask;import java.util.Collection;impo
- 本篇文章介绍SpringBoot的上传和下载功能。一、创建SpringBoot工程,添加依赖compile("org.spring
- http无状态协议的解决:HTTP 是一种无状态协议。 无状态协议不要求服务器在多次请求期间保留有关每个用户的信息或状态。但是某些 Web
- 判断用户输入的是否至少含有N位小数。1.当用户输入的是非数字时抛出异常,返回false。2.当用户输入数字是,判断其数字是否至少含有N位小数
- 目录前言HuTool 中的一些常用工具类日期相关 API随机工具图片工具彩色转换成黑白添加文字水印加密解密工具布隆过滤器邮件工具HTML 工
- 本文实例讲述了java简单列出文件夹下所有文件的方法。分享给大家供大家参考,具体如下:import Java.io.*;public cla
- IntroC# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧SampleC# 9 中增强了模式匹配的用法,增
- Java Object.getClass()方法Object.getClass()方法,这个方法的返回值是Class类型,Class c =
- 一、BroadcastState 的介绍广播状态(Broadcast State)是 Operator State 的一种特殊类型。如果我们
- 在C#程序开发过程中,很多时候可能需要将字符串根据特定的分割字符分割成字符或者List集合,例如根据逗号将字符串分割为数组,或者根据竖线将字
- 目录简介普通邮件导入javax.mail依赖Spring配置类邮件配置:mail.properties测试基于thymeleaf模版的邮件导
- volatile变量volatile是Java的关键词,我们可以用它来修饰变量或者方法。为什么要使用volatilevolatile的典型用
- 先说一下对异步和同步的理解:同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任
- 要说在 Spring Boot 中注册过滤器有三种方式,你都能想到哪些呢?今天松哥就来和大家聊一聊 Spring Boot 中注册过滤器的三
- 6.0的手机对于写入手机需要申请权限的我做了如下处理下面我贴出代码package com.example.admin.sdapplicati
- 在许多游戏中当我们因为一些问题无法接着进行游玩,我们都会选择保存,以便后面有空时,接着游玩。接下来,我们会学习一些Unity有关的存储方法。
- 本文实例为大家分享了C#实现打字小游戏的具体代码,供大家参考,具体内容如下using System;using System.Drawing
- 这是之前软工课设我写的java访问mysql工具类,它经过了多轮的测试,应该能够适应大多数的操作需求。比之前大二写的更鲁棒,更易用。pack
- 一、简介CyclicBarrier 字面意思回环栅栏(循环屏障),它可以实现让一组线程等待至某个状态(屏障点)之后再全部同时执行。叫做回环是
- App Crash对于用户来讲是一种最糟糕的体验,它会导致流程中断、app口碑变差、app卸载、用户流失、订单流失等。相关数据显示,当And