当前位置: 首页 > article >正文

json Date格式化时间偏差8小时,而@JsonFormat注解有无法动态指定时区,如何解决?

use this method to set timezone and replace @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”)

(1)Model field

    @JSONField(format = DateTimeJsonFormatSerializer.TIME_FMT)//fastjson,JSON.toJSONString()
    @JsonSerialize(using = DateTimeJsonFormatSerializer.class)//jackson,影响http request
    @JsonDeserialize(using = DateTimeJsonFormatDeserializer.class)//jackson,影响http response
    private Date deliverTime;

(2) DateTimeJsonFormatSerializer.java


import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

@Slf4j
public class DateTimeJsonFormatSerializer extends JsonSerializer<Date> {
    public static final String TIME_FMT="yyyy-MM-dd HH:mm:ss";
    protected static ThreadLocal<SimpleDateFormat> THREAD_LOCAL = new ThreadLocal<SimpleDateFormat>() {
        @Override
        protected SimpleDateFormat initialValue() {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(TIME_FMT);
            TimeZone timeZone = TimeZone.getDefault();
            //        TimeZone timeZone = TimeZone.getTimeZone("Asia/Shanghai");
            simpleDateFormat.setTimeZone(timeZone);
            return simpleDateFormat;
        }
    };

    public DateTimeJsonFormatSerializer() {
        log.info("DateTimeJsonFormatSerializer default timezone:" + TimeZone.getDefault().getID());
    }

    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeString(THREAD_LOCAL.get().format(date));
    }
}

(3)DateTimeJsonFormatDeserializer.java

import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.text.ParseException;
import java.util.Date;
import java.util.TimeZone;

@Slf4j
public class DateTimeJsonFormatDeserializer extends JsonDeserializer<Date> {
    public DateTimeJsonFormatDeserializer() {
        log.info("DateTimeJsonFormatDeserializer default timezone:" + TimeZone.getDefault().getID());
    }

    @Override
    public Date deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {
        try {
            return DateTimeJsonFormatSerializer.THREAD_LOCAL.get().parse(p.getText());
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}
参考:
https://www.iditect.com/program-example/java--set-current-timezone-to-jsonformat-timezone-value.html
https://cloud.tencent.com/developer/article/2063631

http://www.kler.cn/news/318432.html

相关文章:

  • 从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之二:生产服务器的备份操作
  • 低代码平台后端搭建-阶段完结
  • iOS - TestFlight使用
  • 梧桐数据库(WuTongDB):MySQL 优化器简介
  • 用工厂模式演示springboot三种注入方式 | @Autowired
  • 图文组合商标部分驳回后优化后初审通过!
  • 通信工程学习:什么是NFVO网络功能虚拟化编排器
  • Oracle日常运维(一线DBA必备技能)(四)-综合巡检
  • arduino ide开发esp32-wroom-32E
  • 新版本大疆上云API指令飞行(drc)模式通讯搭建思路
  • 雷池+frp 批量设置proxy_protocol实现真实IP透传
  • 详解c++:new和delete
  • 【数学二】极限的计算-夹逼准则、单调数列有界准则
  • apach httpd多后缀解析漏洞
  • 第十五章 文件上传
  • Linux 清空redis缓存及查询key值
  • 电子计算机科学中的运维技术:概念(内涵和外延)、历史、现状与展望?
  • 【C++二叉树】105.从前序与中序遍历序列构造二叉树
  • OpenAi assistant run always fails when called from PHP
  • Go unique包:突破字符串局限的通用值Interning技术实现
  • 【M-LOAM学习】
  • 【Java】关键字-abstract【主线学习笔记】
  • 《算法笔记》例题解析 第3章入门模拟--4日期处理(9题)2021-03-03
  • 直流负载箱的主要功能有哪些?
  • 数字化转型中的供应链管理优化
  • 鸭脖变“刺客”,啃不起了
  • Leetcode算法基础篇-贪心算法
  • 输入5个数,求中值,verilog实现
  • more、less 命令:阅读文本
  • 电商效果图渲染神器:轻松高效出图