1、默认注解日期格式化
// 转为string:日期按照指定格式进行格式化,在序列化以及反序列化均起作用;
// GET请求及POST表单方式
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthdate;
// 前端传到后台时将固定格式String转换成Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date sendTime;
// 可以同时配置,实现接收与返回不同日期格式
@JsonFormat(pattern = "yyyy/MM/dd", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")
private Date date;
2、自定义序列化与反序列化
- 序列化
public class Date2LongSerialize extends JsonSerializer<Date> {
@Override
public void serialize(Date date,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider)
throws IOException, JsonProcessingException {
jsonGenerator.writeNumber(date.getTime() / 1000);
}
}
@JsonSerialize(using = Date2LongSerialize.class)
private Date addTime;
- 自定义反序列化格式
public static class DateDeserializer extends JsonDeserializer<Date> {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Override
public Date deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext)
throws IOException {
Date date = null;
try {
date = sdf.parse(jsonParser.getText());
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
@JsonDeserialize(using = DateDeserializer.class)
private Date addTime;
3、整合springboot 全局配置
SpringBoot默认的Jackson库的注解:
- 全局配置方法1
@JsonComponent
public class JsonSerializerManage {
@Bean
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//忽略value为null 时 key的输出
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8:00"));
/**
* 序列换成json时,将所有的long变成string
* 因为js中得数字类型不能包含所有的java long值
*/
SimpleModule module = new SimpleModule();
module.addSerializer(Long.class, ToStringSerializer.instance);
module.addSerializer(Long.TYPE, ToStringSerializer.instance);
objectMapper.registerModule(module);
return objectMapper;
}
}
- 全局配置方法2
结合2的自定义方式实现全局配置
@Configuration
public class ConverterConfig {
@Bean
public DateJacksonConverter dateJacksonConverter() {
return new DateJacksonConverter();
}
@Bean
public Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean(
DateJacksonConverter dateJacksonConverter) {
Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean =
new Jackson2ObjectMapperFactoryBean();
jackson2ObjectMapperFactoryBean.setDeserializers(dateJacksonConverter);
return jackson2ObjectMapperFactoryBean;
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(
ObjectMapper objectMapper) {
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter =
new MappingJackson2HttpMessageConverter();
mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper);
return mappingJackson2HttpMessageConverter;
}
}
- 补充
## 日期格式化注意点
y:year-of-era;正正经经的年;
Y:week-based-year;只要本周跨年,
那么这周就算入下一年;也就是 12 月
## jdk8 日期格式化
LocalDate(线程安全)
LocalDate.now()
LocalDate.of(2019,1,1)
格式化:
localDate.format(DateTimeFormatter.BASIC_ISO_DATE)
localDate.format(DateTimeFormatter.ISO_LOCAL_DATE)
自定义格式化:
dateTimeFormatter=DateTimeFormatter.ofPattern("dd/MM/yyyy")
localDate.format(dateTimeFormatter)
解析:
LocalDate.parse("20190910",DateTimeFormatter.BASIC_ISO_DATE)