欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-03 19:09:00
1. springboot设置后台向前台传递date日期格式在springboot应用中,@restcontroller注解的json默认序列化中,日期格式默认为:2020-12-03t15:12:2...

1. springboot设置后台向前台传递date日期格式

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

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

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

1.1 方式1:配置文件修改

配置文件配置application.yml

spring:
 # 配置日期格式化
 jackson:
 date-format: yyyy-mm-dd hh:mm:ss #时间戳统一转换为指定格式
 time-zone: gmt+8 # 时区修改为东8区

application.properties配置方式

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类型转换为我们需要的类型显示。

//在pattern上设置自己需要的格式
	@jsonformat(pattern="yyyy-mm-dd hh:mm:ss")
	private date createtime;

ii. @datetimeformat注解

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

//注解将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格式的日期时间形式。
@temporal(temporaltype.timestamp)
private date createtime;

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

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

2.1 配置string类型表单传参转date的转换器

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的全局日期转换器

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管理

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();
 }
}

到此这篇关于springboot日期格式转换之配置全局日期格式转换器的实例详解的文章就介绍到这了,更多相关springboot日期格式转换内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!