springboot 处理Date的方案

未分类 一条评论

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

 

最后添加一个方法

1条评论

zml2015 says: 回复

博文不少,质量也蛮高的,只是使用的这个wordpress博客模板没有搜索功能啊

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *