Springboot入参时间格式问题

一 自带jackson处理方式

1、返回参数去除null值,使用注解@JsonInclude(JsonInclude.Include.NON_NULL)

@JsonInclude(JsonInclude.Include.NON_NULL)

自带的jackson转化的时候, 默认的时间格式yyyy-MM-dd'T'HH:mm:ss.SSS,也支持

  1. 时间戳格式(1565003805835),
  2. 2019-08-05
  3. 2019-08-05T19:09:450
  4. 2019-08-05T19:09:45+08:00
  5. 传入yyyy-MM-dd HH:mm:ss这种格式,会抛出异常
19:32:10.114 [http-nio-7012-exec-7] WARN  o.s.w.s.m.s.DefaultHandlerExceptionResolver - Resolved exception caused by Handler execution: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize value of type java.util.Date from String "2019-08-05 T 19:16:45": not a valid representation (error: Failed to parse Date value '2019-08-05 T 19:16:45': Can not parse date "2019-08-05 T 19:16:450": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "2019-08-05 T 19:16:45": not a valid representation (error: Failed to parse Date value '2019-08-05 T 19:16:45': Can not parse date "2019-08-05 T 19:16:450": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null))

2. 入参格式化

这时,就可以使用 Spring 的 @DateTimeFormat 注解格式化参数,来解决上述问题。

改造 DateVo:

public class DateVo {
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date date;
 
    public void setDate(Date date){
        this.date = date;
    }
    public Date getDate(){
        return date;
    }
}

再像上面一样访问 /date/test ,并传入参数:2018-08-02 22:05:55,将在控制台上打印:

date1:Thu Aug 02 22:05:55 CST 2018

date2:2018-08-02 22:05:55

可以看到,加入 @DateTimeFormat 注解后参数可以被接收到了,但日期时间的格式还是需要自己再手动转换一下。

因为 @DateTimeFormat 注解的 pattern 属性值指定的日期时间格式并不是将要转换成的日期格式,这个指定的格式是和传入的参数对应的,假如注解为:

@DateTimeFormat(pattern="yyyy/MM/dd HH:mm:ss")

则传入的参数应该是这样的:

2018/08/02 22:05:55

否则会抛出异常。

3. 出参格式化 (springboot默认返回格式为时间戳)

假如出参格式 "date": "1565003805835"

这个格式并不是我们想要的,那么如何将其进行格式化?这时就需要用到 jackson 的 @JsonFormat 注解。

改造 DateVo:

public class DateVo {
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @JsonFormat(  pattern = "yyyy-MM-dd HH:mm:ss")
    private Date date;
 
    public void setDate(Date date){
        this.date = date;
    }
    public Date getDate(){
        return date;
    }
}

传入参数:2018-08-02 22:05:55,可以看到接口返回的结果为:

"date": "2018-08-01 14:32:57"

虽然时间格式正确了,但实际上当前时间是 “2018-08-01 22:32:57” ,早了8个小时。因为,jackson在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时。

所以,@JsonFormat 注解还要再加一个属性:


@JsonFormat(
   pattern = "yyyy-MM-dd HH:mm:ss",
   timezone = "GMT+8"
)

二 fastjson

还原冲统一格式fastjson校验,时间格式传入可以同时兼任时间戳和日期类型

fastjson方式

public class MySpringBootApplication extends WebMvcConfigurerAdapter {

  @Override
    public void configureMessageConverters(List> converters) {
        super.configureMessageConverters(converters);
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        converter.setFastJsonConfig(fastJsonConfig);
        converters.add(converter);
    }

    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication .class, args);
    }
}

参考:https://blog.csdn.net/zhou520yue520/article/details/81348926

你可能感兴趣的:(Springboot入参时间格式问题)