Spring MVC日期格式的一些问题以及思考

Spring MVC日期格式的一些问题以及思考

前言

感觉java的日期类型的设计真地很糟糕,另外很多框架对日期的支持也不太完善,我是这么认为的。
所以在使用的过程中遇到很多问题。

问题的根源

1:日期类型包括涉及到时区,不同地区对应不同格式。
2:不同的业务需求,需要的时间精度不同。
3:相同地区,多种不同的时间格式。如 2020-01-01跟 2020-1-1

经历与思考

第一步

 @ApiOperation(value = "日期参数测试")
    @RequestMapping(path = "datetest/test1", method = RequestMethod.POST)
    public Date dateTest2(
            @RequestBody Date testDate
    ) {
        return testDate;
    }

对应的Swagger如下图所示。
在这里插入图片描述
从对应的传参可以看出这个日期"2020-03-03T14:26:50.380Z"并不是我们熟悉的格式。那如果直接用“2020-03-3 12:00:00”作为参数,是会报400(转换)错误的。如下图所示。
在这里插入图片描述

第二步

那么我们会想,格式是可以转换的。是的,并且我们可以很多种方式去转格式。首选Spring参数就直接支持格式转换。
以下是我网上收罗的几种方法
1):全局的配置方式,通过配置文件配置日期互转的格式,如下

#配置日期格式
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#日期的时区
spring.jackson.time-zone=GMT+8

2):通过注解的方式。

  @JsonFormat(pattern ="yyyy-MM-dd" ,timezone = "GMT-8")
  @DateTimeFormat(pattern = "yyyy-MM-dd")

通过以上的方式,我们可以解决格式转换的问题了,如下图所示,测试通过。
在这里插入图片描述
嗯,貌似问题解决了。但是。。。 如果有需求,一个字段短日期,一个字段是长日期呢?好吧,接下来再折腾。

第三步

是的,还是可以解决的,我们可以通过定义一个类来接收所有的参数,并定义指定的参数,如下:

public class InputClass {
   // @ShortDate()
    @JsonFormat(pattern ="yyyy-MM-dd" ,timezone = "GMT-8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    
    private Date attrDate;
    @JsonFormat(pattern ="yyyy-MM-dd hh:mm:ss" ,timezone = "GMT-8")
    @DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    private Date attrDate2;
    public Date getAttrDate() {
        return attrDate;
    }
    public void setAttrDate(Date attrDate) {
        this.attrDate = attrDate;
    }
    public Date getAttrDate2() {
        return attrDate2;
    }
    public void setAttrDate2(Date attrDate2) {
        this.attrDate2 = attrDate2;
    }
}

嗯,这也不是问题。但我们不禁会想,指定是yyyy-MM-ddd类型的字段,经常会传2020-3-3的格式的数据,还是会照400错误。
情况还止于此,如果你指定的是yyyy-MM-dd hh:mm:ss 格式,传入2020-03-03照样报错。
讲道理,认知里面,2020-3-3跟2020-03-03应该是一样的。2020-03-03应等同于 2020-03-03 00:00:00。如果要做这样的支持呢?那么是不是没能办法了?接下来进一步思考。

第四步

以上是我踩过的坑,不只是自己写接口时要注意,用别人接口再要注意。
于是决定脱坑,在参数传递方面不再使用Date数据类型。用string来替换。 如果是日期类型的时候,自己做判断,可以根据正则表达式来检查传入的类型是什么格式,再使用对应的格式进行转换,完美支持yyyy-MM-dd;yyyy-MM-dd hh:mm:ss; yyyy/MM/dd等格式的并存,接口更强壮。

总结

接口尽量不用Date类型, 用string来替换。

发布了21 篇原创文章 · 获赞 47 · 访问量 3924

猜你喜欢

转载自blog.csdn.net/richyliu44/article/details/104643315
今日推荐