http://xiangai.taobao.com
http://shop148612228.taobao.com

SpringBoot日期格式转换之配置全局日期格式转换器的实例详解

1. SpringBoot设置后台向前台传递Date日期格式

在springboot应用中,@RestController注解的json默认序列化中,日期格式默认为:2020-12-03T15:12:26.000+00:00类型的显示。

SpringBoot日期格式转换之配置全局日期格式转换器的实例详解

在实际显示中,我们需要对其转换成我们需要的显示格式。

1.1 方式1:配置文件修改

配置文件配置application.yml

1
2
3
4
5
spring:
 # 配置日期格式化
 jackson:
 date-format: yyyy-MM-dd HH:mm:ss #时间戳统一转换为指定格式
 time-zone: GMT+8 # 时区修改为东8

application.properties配置方式

1
2
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss  #时间戳统一转换为指定格式
spring.jackson.time-zone=GMT+8  # 时区修改为东8

【注意】这里需要修改时区time-zone:数据库默认时区是格林尼治的时间,如果不设置,会比实际时间少8个小时(北京时间)。

1.2 方式2:在javabean实体类上加注解

 I. @JsonFormat注解

@JsonFormat注解用于属性或方法上,将Date类型转换为我们需要的类型显示。

1
2
3
//在pattern上设置自己需要的格式
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;

II. @DateTimeFormat注解

在需要进行日期格式转换的Date属性上添加注解@DateTimeFormat(pattern = "需要转换的格式")

1
2
3
//注解将yyyy-MM-dd的形式转换为Date数据
 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 private Date birthday;

III. @Temporal注解

通过@Temporal注解,实现日期格式转换,它自带属性参数,比如:

 

@Temporal注解参数作用
TemporalType.DATE @Temporal(TemporalType.DATE),会得到yyyy-MM-dd格式的日期形式。
TemporalType.TIME @Temporal(TemporalType.TIME),会得到HH:MM:SS格式的时间形式。
TemporalType.TIMESTAMP @Temporal(TemporalType.TIMESTAMP),会得到yyyy-MM-dd hh:MM:ss格式的日期时间形式。
1
2
@Temporal(TemporalType.TIMESTAMP)
private Date createTime;

2. SpringBoot配置全局日期格式转换器

配置从页面接收的String和json格式的日期转换为Date类型。

2.1 配置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
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;
 
 
//Converter<S,T> S: 代表的是源,将要转换的数据类型 T:目标类型,将会转成什么数据类型
@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);
 }
 
 //自定义函数,将字符串转Date 参1:传入的日期字符串 参2:格式参数
 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;
 }
 
 
 //convert转换方法 ,s是将会传递过来的日期的字符串
 @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);
  }
 }
}

2.2 配置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 {
 
 //静态初始化final,共享
 public static final GlobalJsonDateConvert instance = new GlobalJsonDateConvert();
 
 //覆盖parse(String)这个方法即可实现
 @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();
 }
}

2.3 配置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
50
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 {
 
 //JSON格式 全局日期转换器配置
 @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();
 }
}
 
 
posted @   万事俱备就差个程序员  阅读(1833)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2015-12-21 数字签名
2015-12-21 SQL server数据缓存依赖
2015-12-21 jQuery的attr与prop,attribute和property区别
2015-12-21 防止SQL注入
2013-12-21 关于C# 中的Attribute 特性
2011-12-21 asp.net 控件生命周期 内的执行步骤
2011-12-21 查询一个表中所有id字段在另一个表中对应值的SQL语句怎么写?

http://xiangai.taobao.com
http://shop148612228.taobao.com
如果您觉得对您有帮助.领个红包吧.谢谢.
支付宝红包
微信打赏 支付宝打赏
点击右上角即可分享
微信分享提示