请求类型为:post,content-type=application/json, 后台用@RequestBody接收,默认接收及返回值格式为:yyyy-MM-dd HH:mm:ss
方式一在application.propertities文件中增加如下内容:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 复制代码
点评:
自定义MappingJackson2HttpMessageConverter中objectMapper指定日期类型序列化即反序列化:
@Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); // 忽略json字符串中不识别的属性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 忽略无法转换的对象 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); // PrettyPrinter 格式化输出 objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true); // NULL不参与序列化 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 指定时区 objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); // 日期类型字符串处理 objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); // java8日期日期处理 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"))); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss"))); objectMapper.registerModule(javaTimeModule); converter.setObjectMapper(objectMapper); return converter; } 复制代码
点评:
以上两种方式为json入参的全局化处理,推荐使用方式二,尤其适合大型项目在基础包中全局设置。
场景: 假如全局日期时间处理格式为:yyyy-MM-dd HH:mm:ss,但是某个字段要求接收或返回日期(yyyy-MM-dd)。
使用springboot自带的注解@JsonFormat(pattern = "yyyy-MM-dd"),如下所示:
@JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8") private Date releaseDate; 复制代码
点评: springboot默认提供,功能强大,满足常见场景使用,并可指定时区。
自定义日期序列化与反序列化,如下所示:
/** * 日期序列化 */ public class DateJsonSerializer extends JsonSerializer<Date> { @Override public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); jsonGenerator.writeString(dateFormat.format(date)); } } /** * 日期反序列化 */ public class DateJsonDeserializer extends JsonDeserializer<Date> { @Override public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException { try { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); return dateFormat.parse(jsonParser.getText()); } catch (ParseException e) { throw new RuntimeException(e); } } } /** * 使用方式 */ @JsonSerialize(using = DateJsonSerializer.class) @JsonDeserialize(using = DateJsonDeserializer.class) private Date releaseDate; 复制代码
实现org.springframework.core.convert.converter.Converter,自定义参数转换器,如下:
@Component public class DateConverter implements Converter<String, Date> { private static final String dateFormat = "yyyy-MM-dd HH:mm:ss"; @Override public Date convert(String value) { /** * 可对value进行正则匹配,支持日期、时间等多种类型转换 * @param value * @return */ SimpleDateFormat formatter = new SimpleDateFormat(dateFormat); try { return formatter.parse(value); } catch (Exception e) { throw new RuntimeException(String.format("parser %s to Date fail", value)); } } } 复制代码
点评: 建议使用方式一时,对前端传递的string进行正则匹配,如yyyy-MM-dd HH:mm:ss、yyyy-MM-dd、 HH:mm:ss等,进行匹配。以适应多种场景。
使用spring自带注解@DateTimeFormat(pattern = "yyyy-MM-dd"),如下:
@DateTimeFormat(pattern = "yyyy-MM-dd") private Date startDate; 复制代码
点评: 如果使用了方式一,spring会优先使用方式一进行处理,即方式二不生效。