Springboot中日期映射的设置

Spring中存在两个地方可以设置日期格式,一个是 spring.mvc.date-format,还有一个是spring.jackson.date-format。现在说说他们的区别。

spring.mvc.date-format

spring.mvc.date-format是针对x-www-form-urlencoded这种编码的数据,也就是通过表单<form>上传上来的数据。

我们假设Java的代码是这样,并且在localhost:80监听:

//POJO
pubulic class OneDate{
    private String name;
    private Date date;
    //省略函数
}
//Controller
@Controller
public class OneController{
    @RequestMapping("/up")
    public String getDate(OneDate d){
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
        System.out.println(format.format(d));
        return "onePage";
    }
}

这是我们使用curl进行测试。

以下可以通过:

#POST
curl -X POST -d 'name=build&date=2000/1/2' 'http://localhost/up'
curl -X POST -d 'name=build&date=2000/1/2 14:32:56' 'http://localhost/up'
curl -X POST -d 'name=build&date=2000/1/2 14:32:56 GMT' 'http://localhost/up'
curl -X POST -d 'name=build&date=Jan 2 2000 14:32:56 GMT' 'http://localhost/up'
# 使用GET也是一样的
curl 'http://localhost/json?name=build&date=2000/2/3%2014:32:56'

但是使用横杠分割就不行。

curl -X POST -d 'name=build&date=2000-1-2 14:32:56' 'http://localhost/up'
# 这里会返回错误信息: Failed to convert from type [java.lang.String] to type [java.util.Date]

这里的原理是,当没有配置spring.mvc.date-format这个选项时,spring会使用Date的一个废弃的构造函数

@Deprecated
public Date(String s) {
    this(parse(s));
}

来进行字符串到日期的转换。能否转换成功取决于这个parse函数。所以还是应该显式地设置好这个配置项。

注意!设置好后,默认的parse就不会生效了,只会使用设置的格式。

这里不设置时区的话,就会使用服务端的本地时区。所以完美一点的话,应该在格式中把时区也加上。

spring.jackson.date-format

spring.jackson.date-format则是设置识别HTTP请求的body中的日期字符串的格式。对应的类型是application/json

假设我们有这样的Java代码(POJO同上):

@Controller
public class OneController2{
    @PostMapping("/up")
    public String getDate2(@RequestBody OneDate d){
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
        System.out.println(format.format(d));
        return "onePage";
    }
}

然后我们用curl继续测试。

curl -X POST -d '{"name":"build","date":"2020/2/12"}' -H "Content-Type: application/json" 'http://localhost/up'

这个语句会返回错误(没想到吧?json这里默认不是用斜线!和之前的不一样!)

错误语句说: Cannot parse date \"2020/2/12\": not compatible with any of standard forms (\"yyyy-MM-dd'T'HH:mm:ss.SSSZ\", \"yyyy-MM-dd'T'HH:mm:ss.SSS\", \"EEE, dd MMM yyyy HH:mm:ss zzz\", \"yyyy-MM-dd\"));

可以看出jackson里的设置了四个格式。如果都不匹配则会报错。

正确的示例如下:

"2020-2-2" #仅日期,对应yyyy-MM-dd

# 对应 EEE, dd MMM yyyy HH:mm:ss zzz ,
“Wed, 12 Feb 2020 13:45:56 GMT”  # 对应JS中的toGMTString()
“Wed, 12 Feb 2020 13:45:56 +0800”

# 对应 yyyy-MM-dd'T'HH:mm:ss.SSS
“2020-02-03T13:45:56.142”   # 这里不能写成2020-2-3

# 对应 yyyy-MM-dd'T'HH:mm:ss.SSSZ ,对应JS的toISOString()
“2020-02-03T13:45:56.142Z” # Z代表0时区,中国是+8时区

注意!与上一节不同,jackson里不写时区,默认就是0时区。
想要设置默认时区,使用spring.jackson.time-zone=GMT+8

猜你喜欢

转载自www.cnblogs.com/modyuan/p/12302121.html
今日推荐