spring boot 默认使用的jackson,并对默认做了配置。
当在web中返回Date类型数据,默认是Long的数字,当需要返回自定义格式的时候可以用如下的方法
======将对象的Date转成json,同样也能将json转成对象的Date=====
注: form表单提交的话是不能将字符串转成对象的Date的
1:(全局性的修改)
application.yml中修改默认的配置
修改字符串的格式
spring.jackson.date-formate = yyyy-MM-dd HH:mm:ss
这样修改后会有8小时的时差,还需要如下的配置
修改时区
spring.jackson.time-zone = GMT+8
2:(局部性的修改,会覆盖全局配置该属性的作用)
有是有需要对局部性的修改
在Date的属性上添加注解来实现,道理通1,格式和时区
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
3:使用alibaba的Fastjson
启动类中注入bean
@Bean
public HttpMessageConverters messageConverter() {
// 1. 需要定义一个converter转换消息的对象
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
// 2. 添加fastjson的配置信息,比如:是否需要格式化返回的json的数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 3. 在converter中添加配置信息
fastJsonConfig.setDateFormat("yyyy/MM/dd HH:mm:ss");
converter.setFastJsonConfig(fastJsonConfig);
return new HttpMessageConverters(converter);
}
4: 重写mvc的方法
继承WebMvcConfigurerAdapter,重写方法
WebMvcConfigurerAdapter 已经过期,改由 WebMvcConfigurationSupport 继承
可用重写的方法请参考该博客 https://blog.csdn.net/icarusliu/article/details/79477343
@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
// 1.需要先定义一个convert 转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
// 2.添加fastJson的配置信息,比如,是否需要格式化返回的json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
// 空值特别处理
// WriteNullListAsEmpty 将Collection类型字段的字段空值输出为[]
// WriteNullStringAsEmpty 将字符串类型字段的空值输出为空字符串 ""
// WriteNullNumberAsZero 将数值类型字段的空值输出为0
// WriteNullBooleanAsFalse 将Boolean类型字段的空值输出为false
fastJsonConfig.setSerializerFeatures(
SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullStringAsEmpty);
// 处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonConfig.setDateFormat("yyyy/MM/dd HH:mm:ss");
// 3.在convert中添加配置信息
fastConverter.setFastJsonConfig(fastJsonConfig);
// 4.将convert添加到converters当中
converters.add(fastConverter);
}
}
========================form表单提交转成对象的Date==================================
默认是能将 yyyy-MM-dd 格式的字符转转成日期类型
1:(局部方法)在对象的属性上添加数值解实现
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
在form表单提交的时候能将对应的字符串转成日期类型
2:自定义BaseController,,其余的contrller 来集成该类即可
public class BaseController {
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
//格式yyyy-MM-dd HH:mm:ss,不能在更改了,灵活性差
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
}
3:继承WebMvcConfigurerAdapter,重写方法
WebMvcConfigurerAdapter 已经过期,改由 WebMvcConfigurationSupport 继承
重写addFormatters 方法,重写日期转换方法
@Override
protected void addFormatters(FormatterRegistry registry) {
registry.addConverter(new Converter<String, Date>() {
@Nullable
@Override
public Date convert(String source) {
return convertString(source);
}
});
}
convertString就是4里面的转换方法
4: 大招自定义DateConverterConfig实现spring提供的Converter重写里面的convert方法
@Component//交给spring 管理
public class DateConverterConfig implements Converter<String, Date> {
private static final List<String> formarts = new ArrayList<>(4);
static{
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd hh:mm:ss");
}
@Override
public Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if(source.matches("^\\d{4}-\\d{1,2}$")){
return parseDate(source, formarts.get(0));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
return parseDate(source, formarts.get(1));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(2));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(3));
}else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 格式化日期
* @param dateStr String 字符型日期
* @param format String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date=null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = dateFormat.parse(dateStr);
} catch (Exception e) {
}
return date;
}
}
也可参考这个额https://blog.csdn.net/xiangluer/article/details/81913137
最后添加一个方法