我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringBoot中 Jackson 日期的时区和日期格式问题解决

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringBoot中 Jackson 日期的时区和日期格式问题解决

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的源码


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开发应用之中设计日期转换需要特别注意,能够主要目标能够是的存储和返回的日期能够对应上自己的本地时区。同时能够使用较为通用的转换方式解决相关问题。

免责声明:

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

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

SpringBoot中 Jackson 日期的时区和日期格式问题解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

SpringBoot中 Jackson 日期的时区和日期格式问题解决

因为最近项目需要国际化,需要能够支持多种国际化语言,目前需要支持三种(法语、英语、简体中文),这篇文章主要介绍了SpringBoot中 Jackson 日期的时区和日期格式问题,需要的朋友可以参考下
2022-12-10

SpringBoot中Jackson日期格式化的方法

这篇“SpringBoot中Jackson日期格式化的方法”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot
2023-06-30

springboot日期格式化及时差问题分析

这篇文章主要介绍了springboot日期格式化,时差问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2022-12-10

解决MySQL时区日期时差8个小时的问题

目录场景:解决:mysql查出时间相差14小时问题重现问题排查场景:我们在mysql客户端查询 now() 系统当前日期时间,会发现得到的结果比系统实际日期时间慢8个小时左右,这是由于不同的时区导致的解决:1、在 mysql 的服务端
2023-01-04

LocalDateTime日期时间格式中间多了一个T的问题及解决

这篇文章主要介绍了LocalDateTime日期时间格式中间多了一个T的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-03-09

C语言系统日期和时间问题怎么解决

这篇文章主要讲解了“C语言系统日期和时间问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言系统日期和时间问题怎么解决”吧!⒈题目内容输出系统的日期以及时间。在本代码当中只有一个
2023-07-02

如何处理Python中的日期和时间问题

如何处理Python中的日期和时间问题,需要具体代码示例在开发过程中,处理日期和时间是一个常见的任务。无论是计算两个日期之间的差距、格式化日期字符串,还是进行时间的加减运算,都是开发中经常遇到的需求。Python提供了丰富的日期和时间处理库
2023-10-22

JS利用Intl解决前端日期和时间的格式化详解

Intl 是一个全局对象,它的主要用途就是展示国际化信息,可以将字符串,数字和日期和时间转换为指定地区的格式。这篇文章就来和大家聊聊如何利用Intl解决前端日期和时间的格式化吧
2023-03-08

JS怎么利用Intl解决前端日期和时间的格式化

这篇“JS怎么利用Intl解决前端日期和时间的格式化”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JS怎么利用Intl解决前
2023-07-05

如何在Python中处理日期和时间的问题

如何在Python中处理日期和时间的问题在编写软件时,处理日期和时间是一个常见的需求。Python作为一门功能强大的编程语言,提供了丰富的库和方法来处理日期和时间。本文将介绍如何在Python中处理日期和时间的问题,并提供一些具体的代码示例
2023-10-22

LocalDateTime日期时间格式中间多了一个T如何解决

本篇内容主要讲解“LocalDateTime日期时间格式中间多了一个T如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“LocalDateTime日期时间格式中间多了一个T如何解决”吧!Lo
2023-07-05

sql中的字符串格式和日期格式不一致时怎么比较

如何解决 sql 中字符串和日期格式不一致时的比较问题?对于字符串和日期格式不一致的比较问题,可以采取以下步骤解决:1. 将日期转换为字符串。2. 将字符串转换为日期。3. 使用合适的比较运算符进行比较。例如:select * from m
sql中的字符串格式和日期格式不一致时怎么比较
2024-05-08

日期和时间问题使得win8无法激活 windows解决方法

不知道win8无法激活怎么办?没关pQkdGSF系,下文将会告诉大家win8无法激活Windows解决方法,是什么原因造成win8不能激活呢?微软官方给出了javascript该故障的android原因以及解决方法,大家可以来看一看。如下图
2023-06-03

解决vue中el-date-picker type=daterange日期不回显的问题

这篇文章主要介绍了解决vue中el-date-picker type=daterange日期不回显的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录