SpringBoot 设置后台向前台传递 Date 日期格式
在 SpringBoot应用中,@RestController 注解的 json 默认序列化中,日期格式默认为:2020-12-03T15:12:26.000+00:00 类型的显示

在实际显示中,我们需要对其转换成我们需要的显示格式
方式一:配置文件修改
配置文件配置 application.yml
1 2 3 4 5
| spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
|
application.properties 配置方式
1 2
| spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
|
这里需要修改时区 time-zone:数据库默认时区是格林尼治的时间,如果不设置,会比实际时间少 8 个小时(北京时间)
方式二:在实体类上加注解
@JsonFormat 来源于 Jackson,它是一个简单基于 Java 应用库。@JsonFormat 注解用于属性或方法上,将 Date 类型转换为我们需要的类型显示
1 2 3 4 5
| public class Order { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createDate; }
|
@DateTimeFormat 是 Spring 自带的处理框架,主要用于将时间格式化
1 2 3 4
| public class Order { @DateTimeFormat(pattern = "yyyy-MM-dd") private Date createDate; }
|
@JSONField 注解
@JSONField 来源于 fastjson,是阿里的开源框架,主要进行 JSON 解析和序列化
1 2 3 4
| public class Order { @JSONField(format="yyyy-MM-dd HH:mm:ss") private Date time; }
|
@Temporal 注解
通过 @Temporal 注解,实现日期格式转换,它自带属性参数

1 2 3 4
| public class Order { @Temporal(TemporalType.TIMESTAMP) private Date time; }
|
SpringBoot 配置全局日期格式转换器
配置从页面接收的 String 或 json 格式的日期转换为 Date 类型
配置 String 类型表单传参转 Date 的转换器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;
@Component public class GlobalFormDateConvert implements Converter<String, Date> {
private static final List<String> paramList = new ArrayList<>();
private static final String param1 = "yyyy-MM"; private static final String param2 = "yyyy-MM-dd"; private static final String param3 = "yyyy-MM-dd HH:mm"; private static final String param4 = "yyyy-MM-dd HH:mm:ss";
static { paramList.add(param1); paramList.add(param2); paramList.add(param3); paramList.add(param4); }
public Date parseDate(String source, String format) { System.out.println("parseDate转换日期"); Date date = null; try { DateFormat dateFormat = new SimpleDateFormat(format); date = dateFormat.parse(source); } catch (Exception e) { e.printStackTrace(); } return date; }
@Override public Date convert(String source) {
System.out.println("convert日期格式转换器"); if(StringUtils.isEmpty(source)){ return null; } source = source.trim(); DateFormat dateFormat = new SimpleDateFormat(param1);
if (source.matches("^\\d{4}-\\d{1,2}$")) { return parseDate(source, paramList.get(0)); } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { return parseDate(source, paramList.get(1)); } else if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) { return parseDate(source, paramList.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, paramList.get(3)); } else { throw new IllegalArgumentException("还未定义该种字符串转Date的日期转换格式 --> 【日期格式】:" + source); } } }
|
配置 Json 数据转 Date 的全局日期转换器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| import java.text.FieldPosition; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Date; import com.fasterxml.jackson.databind.util.StdDateFormat; import org.springframework.util.StringUtils;
public class GlobalJsonDateConvert extends StdDateFormat {
public static final GlobalJsonDateConvert instance = new GlobalJsonDateConvert();
@Override public Date parse(String dateStr, ParsePosition pos) { return getDate(dateStr, pos); }
@Override public Date parse(String dateStr) { ParsePosition pos = new ParsePosition(0); return getDate(dateStr, pos); }
private Date getDate(String dateStr, ParsePosition pos) { System.out.println("json格式日期转换"); SimpleDateFormat sdf = null; if (StringUtils.isEmpty(dateStr)) { return null; } else if (dateStr.matches("^\\d{4}-\\d{1,2}$")) { sdf = new SimpleDateFormat("yyyy-MM"); return sdf.parse(dateStr, pos); } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.parse(dateStr, pos); } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")) { sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); return sdf.parse(dateStr, pos); } else if (dateStr.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) { sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.parse(dateStr, pos); } else if (dateStr.length() == 23) { sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); return sdf.parse(dateStr, pos); } return super.parse(dateStr, pos); }
@Override public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(date, toAppendTo, fieldPosition); }
@Override public GlobalJsonDateConvert clone() { return new GlobalJsonDateConvert(); } }
|
配置 bean 交给 Spring 管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.xgf.online_mall.convert.GlobalFormDateConvert; import com.xgf.online_mall.convert.GlobalJsonDateConvert; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.ConversionServiceFactoryBean; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.converter.Converter; import org.springframework.http.MediaType; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import java.util.ArrayList; import java.util.List; import java.util.HashSet; import java.util.Set;
@Configuration public class WebConfig {
@Bean public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() { MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setDateFormat(GlobalJsonDateConvert.instance); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); List<MediaType> list = new ArrayList<MediaType>(); list.add(MediaType.APPLICATION_JSON_UTF8); mappingJackson2HttpMessageConverter.setSupportedMediaTypes(list); return mappingJackson2HttpMessageConverter; }
@Bean @Autowired public ConversionService getConversionService(GlobalFormDateConvert globalDateConvert){ ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean(); Set<Converter> converters = new HashSet<>(); converters.add(globalDateConvert); factoryBean.setConverters(converters); return factoryBean.getObject(); } }
|
自定义 Jackson - ObjectMapper 的配置
ObjectMapper 是 Jackson 核心库中的主要对象,用于将 Java 对象序列化为 JSON,并将 JSON 反序列化为 Java 对象。
Jackson2ObjectMapperBuilderCustomizer 允许自定义 ObjectMapper 的各种配置,例如:
- 序列化和反序列化格式
- 属性命名策略
- 日期和时间格式
- 字段过滤和包含
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| import cn.hutool.core.date.DatePattern; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jsr310.PackageVersion; import com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.context.annotation.Bean;
import java.time.*; import java.time.format.DateTimeFormatter; import java.util.Locale; import java.util.TimeZone;
@AutoConfiguration @ConditionalOnClass(ObjectMapper.class) @AutoConfigureBefore(JacksonAutoConfiguration.class) public class JacksonConfiguration {
@Bean @ConditionalOnMissingBean public Jackson2ObjectMapperBuilderCustomizer customizer() { return builder -> { builder.locale(Locale.CHINA); builder.timeZone(TimeZone.getTimeZone(ZoneId.systemDefault())); builder.simpleDateFormat(DatePattern.NORM_DATETIME_PATTERN); builder.serializerByType(Long.class, ToStringSerializer.instance); builder.modules(new JavaTimeModule()); }; } static class JavaTimeModule extends SimpleModule { public JavaTimeModule() { super(PackageVersion.VERSION);
this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DatePattern.NORM_DATETIME_FORMATTER)); this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE)); this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME)); this.addSerializer(Instant.class, InstantSerializer.INSTANCE);
this.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DatePattern.NORM_DATETIME_FORMATTER)); this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE)); this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME)); this.addDeserializer(Instant.class, InstantDeserializer.INSTANT); } } }
|