欢迎光临散文网 会员登陆 & 注册

springboot 多种时间格式转换

2022-12-21 23:09 作者:万事俱备就差个程序员  | 我要投稿

我们知道,springboot 有个配置时间格式的参数:spring.jackson.date-format

通常使用方式是:

spring:  jackson:    date-format: yyyy-MM-dd HH:mm:ss

如果我需要传 yyyy-MM-dd 格式的话,那就只能再加个 @JsonFormat 注解来为它单独指定格式。有没有更方便的办法呢?

spring.jackson.date-format帮我们做了什么?

到源码中可以看到,date-format 原本应该是接收一个 DateFormat 的类路径的,但我们一般写的是一个时间格式字符串,所以默认使用的 DateFormat 的子类 SimpleDateFormat 来为我们转换时间格式。其实我们大可以传一个自定义的 DateFormat 类进去。

Untitled.png

💡 既然方案找到了,那么实现起来就很简单了,我们自定义一个类,继承 DateFormat,但实际上,如果直接继承 DateFormat 抽象类,你可能还需要像 SimpleDateFormat 一样,在里面需要自己初始化一堆复杂的参数,其实我们需要的仅仅是让它支持多种时间格式,而 SimpleDateFormat 已经为我们做好了这一切,不同的只是需要我们为它指定不同的格式类型,所以,可以直接继承 SimpleDateFormat,然后重写它的 parse 和 format 方法即可达到我们的目的。

package com.yc.kfpt.webcommons.plugin;import java.text.DateFormat;import java.text.FieldPosition;import java.text.ParsePosition;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;/** * 支持多种时间格式转换,使用方法 * <code> * spring: *   jackson: *     date-format: com.yc.kfpt.webcommons.plugin.DateFormatPlugin * </code> * @author 敖癸 * @formatter:on * @since 2022/11/4 */public class DateFormatPlugin extends SimpleDateFormat {    private static final List<DateFormat> FORMATS = new ArrayList<>(5);    private static final String YYYY_MM = "^\\d{4}-\\d{1,2}$";    private static final String YYYY_MM_DD = "^\\d{4}-\\d{1,2}-\\d{1,2}$";    private static final String YYYY_MM_DD_HH_MM = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$";    private static final String YYYY_MM_DD_HH_MM_SS = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$";    private static final String YYYY_MM_DD_HH_MM_SS_SSS = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{3}$";    static {        FORMATS.add(new SimpleDateFormat("yyyy-MM"));        FORMATS.add(new SimpleDateFormat("yyyy-MM-dd"));        FORMATS.add(new SimpleDateFormat("yyyy-MM-dd HH:mm"));        FORMATS.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));        FORMATS.add(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"));    }    @Override    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {        return FORMATS.get(3).format(date, toAppendTo, fieldPosition);    }    @Override    public Date parse(String source, ParsePosition pos) {        String value = source.trim();        if ("".equals(value)) {            return null;        }        if (source.matches(YYYY_MM)) {            return FORMATS.get(0).parse(source, pos);        } else if (source.matches(YYYY_MM_DD)) {            return FORMATS.get(1).parse(source, pos);        } else if (source.matches(YYYY_MM_DD_HH_MM)) {            return FORMATS.get(2).parse(source, pos);        } else if (source.matches(YYYY_MM_DD_HH_MM_SS)) {            return FORMATS.get(3).parse(source, pos);        } else if (source.matches(YYYY_MM_DD_HH_MM_SS_SSS)) {            return FORMATS.get(4).parse(source, pos);        } else {            throw new IllegalArgumentException("Invalid datetime value " + source);        }    }}

最后,我们再修改我们的配置,把 spring.jackson.date-format 指定我们自定义的DateFormat 子类。

spring:  jackson:    date-format: com.yc.kfpt.webcommons.plugin.DateFormatPlugin

如此,我们就能同时支持前端传过来的各种时间格式了,我们只需要用 Date 接收,剩下的就都交给 DateFormat 来帮我们完成了。



作者:DimonHo
链接:https://www.jianshu.com/p/12b47cffd3ad
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


springboot 多种时间格式转换的评论 (共 条)

分享到微博请遵守国家法律