Jackson(二):@JsonFormat时间格式及时区问题

一、说明

今天遇到一个查了很久的问题,具体表现为前端传过来的时间参数的时区是+0800,我用Jackson反序列化成对象时,时间解析出来还是正确的,但是我再将对象序列化为Json数据时时区又变成了+0000时区,导致前端出现了问题,但是服务器上用命令date看时,时区也是正确的。解决后在此记录一下解决方法。

1.1 @JsonFormat

用途:表示json序列化的一种格式或者类型,常用来转换时间的格式。
用法:@JsonInclude(pattern=日期的格式,timezone=默认是GMT,东八区需要使用GMT+8.值)。
(仅说明时间格式的转换)

二、示例

2.1 操作

测试数据:

  {
  "time1": "2022-09-16T16:26:48+0800",
  "time2": "2022-09-16T16:27:48+0800"
  }

实体类

@JsonIgnoreProperties(ignoreUnknown = true)
@Getter
@Setter
@ToString
public class Body{
  @JsonFormat(pattern = Serializer.DATE_FORMAT, timezone = "GMT+8")
  private Date time1;
  @JsonFormat(pattern = Serializer.DATE_FORMAT, timezone = "GMT+8")
  private Date time2;

封装Jackson的类

public class Serializer{
  public static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ";
  private final ObjectMapper mapper = new ObjectMapper();

  public Serializer() {
    mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);
  }
  public Date decodeTime(String str) throws SkyLinkException {
    if (str == null || str.isEmpty()) {
      return null;
    }
    SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
    try {
      return sdf.parse(str);
    } catch (ParseException e) {
      throw new SkyLinkException(e);
    }
  }

  public String encodeTime(Date date) throws SkyLinkException {
    if (date != null) {
      SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT);
      return sdf.format(date);
    }
    return null;
  }
  
  public <T> String encode(T obj) throws SkyLinkException {
    try {
      return mapper.writeValueAsString(obj);
    } catch (JsonProcessingException e) {
      throw new SkyLinkException(e);
    }
  }

  public <T> T decode(String json, Class<T> cls) throws SkyLinkException {
    try {
      return mapper.readValue(json, cls);
    } catch (IOException e) {
      throw new SkyLinkException(e);
    }
  }

说明:此处Body类的time1、time2上如果没加上timezone = “GMT+8”,那么我调用Serializer类的encode后,结果time1和time2就变成了2022-09-16T8:26:48+0000。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值