之前在前后端交互过程中,针对时间类型的字段,在DTO中使用
String
类型接收,在后台转成Date
类型。但这样处理太麻烦。
JDK8的新特性中Time API,其包括Clock
、Duration
、Instant
、LocalDate
、LocalTime
、LocalDateTime
、ZonedDateTime
,这里介绍Spring Boot处理LocalDateTime格式。
Controller接收参数
在Spring中,接收LocalDateTime日期时间数据时,只需要使用@DateTimeFormat注解即可。@DateTimeFormat可以注解在字段、参数以及方法上,如果接收的为DTO,则需要将@DateTimeFormat注解在DTO中的字段上。(注意:前台传的参数格式必须与pattern
定义格式一致)
@GetMapping("date")
public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime date) {
return date;
}
@GetMapping("date2")
public Object date(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate date) {
return date;
}
ResponseBody格式化LocalDateTime
Spring默认使用使用jackson来进行json格式转换。这里需要加入jackson
的jsr310
扩展包。
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.9</version>
</dependency>
使用@JsonFormat注解
public class InfoDTO {
/**
* 创建时间
*/
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createDate;
//get/set方法省略
}
使用ObjectMapper
使用@Bean
注解创建一个ObjectMapperBean,并将JavaTimeModule
注册到ObjectMapper中即可,spring
会使用该bean创建MappingJackson2HttpMessageConverter
进行json
格式转换。
@Bean(name = "mapperObject")
@Primary
public ObjectMapper getObjectMapper() {
ObjectMapper om = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
om.registerModule(javaTimeModule);
return om;
}
后续
在使用 @DateFormat
进行参数转换的时候,只能接收url参数,或者表单提交参数。如果参数对象是以JSON传递过来的,这时使用该注解就无法进行转化。
@RestController
public class Controller {
@PostMapping("/")
public void post(@RequestBody InfoDTO infoDTO) {}
}
public class InfoDTO {
/**
* 创建时间
*/
@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonFormat(pattern = "yyyyMMdd")
private LocalDateTime createDate;
//get/set方法省略
}