jackson序列化时区问题

简介: jackson序列化时区问题

念人之过必忘人之功——佚名

今天发现返回给前端的Date和数据库中查到的时间对不上

排查发现是Jackson指定时区问题,原先用的GMT+8,但数据库是Asia/Shanghai

ObjectMapper shanghaiObjectMapper = new ObjectMapper()
                .setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))
                .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

引用:https://alphahinex.github.io/2021/10/31/difference-between-gmt-plus-8-and-asia-shanghai/

里面提到的

GMT+8Asia/Shanghai 的区别

  • GMT+8 因为没有位置信息,所以无法使用夏令时
  • Asia/Shanghai 使用夏令时

时间戳字符串中不包含时区信息时,解析到的具体时区如果是使用夏令时的,就会跟不使用夏令时的时区,时间不一致。

复现:

package com.ruben.simplestreamquery;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
@SpringBootTest
class SimpleStreamQueryApplicationTests {
    @Test
    void testQuery() throws JsonProcessingException {
        Date date = new Date(1989 - 1900, Calendar.JULY, 4);
        ObjectMapper gmt8ObjectMapper = new ObjectMapper()
                .setTimeZone(TimeZone.getTimeZone("GMT+8"))
                .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        ObjectMapper shanghaiObjectMapper = new ObjectMapper()
                .setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"))
                .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        Assertions.assertEquals("\"1989-07-04 00:00:00\"", gmt8ObjectMapper.writeValueAsString(date));
        Assertions.assertEquals("\"1989-07-04 00:00:00\"", shanghaiObjectMapper.writeValueAsString(date));
    }
}

文章还进行了科普:

夏令时

夏令时(Daylight Saving Time: DST),也叫 夏时制,是指为了节约能源,在天亮的早的夏季,人为将时间调快一小时,以充分利用光照资源,节约照明用电。

在冬季光照时间变短后,将时间再拨回一小时的标准时间,也称为冬令时。

中国在 1986 年至 1991 年也实行过夏令时:

1986年4月,中国中央有关部门发出“在全国范围内实行夏时制的通知”,具体做法是:每年从四月中旬第一个星期日的凌晨2时整(北京时间),将时钟拨快一小时,即将表针由2时拨至3时,夏令时开始;到九月中旬第一个星期日的凌晨2时整(北京夏令时),再将时钟拨回一小时,即将表针由2时拨至1时,夏令时结束。从1986年到1991年的六个年度,除1986年因是实行夏时制的第一年,从5月4日开始到9月14日结束外,其它年份均按规定的时段施行。在夏令时开始和结束前几天,新闻媒体均刊登有关部门的通告。1992年起,夏令时暂停实行。 —— 引自百度百科 夏令时

相关文章
|
5月前
|
JSON Java API
jackson序列化和反序列化中的注解和扩展点大全【收藏】
jackson序列化和反序列化中的注解和扩展点大全【收藏】
|
5月前
|
NoSQL Redis
redis使用jackson序列化数据配置文件
redis使用jackson序列化数据配置文件
119 5
|
5月前
|
Java
springboot解决jackson序列化Long类型精度失效问题
springboot解决jackson序列化Long类型精度失效问题
135 0
|
6月前
|
JSON Java Maven
使用Jackson进行 JSON 序列化和反序列化
使用Jackson进行 JSON 序列化和反序列化
131 0
|
缓存 NoSQL Java
最详细 | redis实战:JackSon/FastJson方式序列化深度解析
Jackson2JsonRedisSerializer和FastJsonRedisSerializer的实战应用
3304 0
|
JSON Java 数据格式
Jackson对象 ObjectMapper实现序列化数据为json
Jackson对象 ObjectMapper实现序列化数据为json
|
JSON 前端开发 Java
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
424 0
|
JSON Java 数据格式
Java:jackson处理LocalDateTime序列化的时候报错InvalidDefinitionException
Java:jackson处理LocalDateTime序列化的时候报错InvalidDefinitionException
1057 0
|
Dubbo Java 应用服务中间件
再谈序列化之rpc调用失败和jackson序列化时不允许Map中的key为null
再谈序列化之rpc调用失败和jackson序列化时不允许Map中的key为null
237 0
|
14天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。