开发中日期时间格式问题的解决方案

在开发中遇到提交的日期数据与底层数据表的日期时间类型不匹配的时候的情况,
这是因为提交的日期数据在网线中传输的都是字符串类型,而数据表要求的是datetime类型,
所以会引发类型不匹配的异常。
解决方案:
方案一:请求后台的时候,SpringBoot会自动进行转化,此时无法将字符串转化为Date,
此时就需要我们强制转化:
1.写一个SpringToDateConverter implements Converter<String,Date>,并实现convert方法。

import org.springframework.core.convert.converter.Converter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDateConverter implements Converter<String,Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String dateFormat2 = "yyyy/MM/dd HH:mm:ss";
private static final String shortDateFormat2 = "yyyy/MM/dd";

@Override
public Date convert(String source) {
if(null==source||"".equals(source)){
return null;
}
source = source.trim();
try {
SimpleDateFormat formatter;
if(source.contains("-")){
if(source.contains(":")){
formatter = new SimpleDateFormat(dateFormat);
}else {
formatter = new SimpleDateFormat(shortDateFormat);
}

Date dtDate = formatter.parse(source);
return dtDate;
}else if(source.contains("/")){
if(source.contains(":")){
formatter = new SimpleDateFormat(dateFormat2);
}else{
formatter = new SimpleDateFormat(shortDateFormat2);
}
Date dtDate = formatter.parse(source);
return dtDate;
}
}catch (Exception e){
throw new RuntimeException(String.format("parse %s to Date fail",source));
}

throw new RuntimeException(String.format("parse %s to Date fail",source));

}
}

2.定制自己的一个@Configuration类型,在SpringBoot启动过程中可以作为配置文件加载。
@Configuration
public class WebConfigBeans {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter; //处理器适配器
@PostConstruct
public void initEditableValidation(){
ConfigurableWebBindingInitializer initializer =(ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer();
if(initializer.getConversionService()!=null){
GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();
//向现有的环境中注册了自己的 一个日期格式转换器 StringToDateConverter
genericConversionService.addConverter(new StringToDateConverter());
}
}
}

3.从数据库表中获取数据的展示(关于List列表中时间格式的设定):在实体类属性上添加:
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")


方案二:
1.定制一个util的工具类
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonDateSerializer extends JsonSerializer<Date> {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException,JsonProcessingException {
String value = dateFormat.format(date);
jsonGenerator.writeString(value);
}
}

2.在Model中加入注解
/*界面上的数据显示*/
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
/*控制的是数据进入到后台的格式*/
@JsonSerialize(using = JsonDateSerializer.class)


方案三:(有待考证,部分计算机上行不通,会报错)
直接在Model层的对应字段上添加了如下注解:
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")


注意;推荐大家使用第一种方案

转载于:https://www.cnblogs.com/jinyanbin/p/9623034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值