@DateTimeFormat @JsonFormat @JSONField 日期参数格式化 浅浅的花香味﹌ 2023-06-07 05:44 2阅读 0赞 最近一朋友弟弟问我前端传日期参数后台接收报错怎么解决,其实这个问题很简单,一般简单数据类型前端传参请求头分为两种格式,第一种 application/x-www-form-urlencoded 表单形式,第二种 application/json JSON格式。针对这两种header需要不同的方式去接收,后台需要将日期字符串转换成Date类型。前端Content-Type 为application/json的请求时,我们使用@JsonFormat来进行转化,如果为表单,则应该使用@DateTimeFormat。 1. **application/x-www-form-urlencoded** 表单形式 后台接收参数用bean 接收,对于日期类型需要加上**@DateTimeFormat 注解,**这样会自动将日期字符串转换成Date类型,具体的日期格式自定义,例如 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss",iso= DateTimeFormat.ISO.DATE\_TIME) 上面这种方式只能针对针对配置了@DateTimeFormat 注解属性做转换。没有加该注解的属性依旧不能正常接收日期参数,因此有一种万能的方式,我们自定义日期转换器,需要实现Converter<S, T> 接口,S代表要转换的参数,T代表转换后的参数,这里是String ---》Date package com.changteng.configurer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @Component public class DateConverterConfigure implements Converter<String, Date> { private final Logger logger = LoggerFactory.getLogger( this.getClass() ); private static final List<String> formarts = new ArrayList<>(4); static{ formarts.add("yyyy-MM"); formarts.add("yyyy-MM-dd"); formarts.add("yyyy-MM-dd HH:mm"); formarts.add("yyyy-MM-dd HH:mm:ss"); } @Override public Date convert(String source) { String value = source.trim(); if ("".equals(value)) { return null; } if(source.matches("^\\d{4}-\\d{1,2}$")){ return parseDate(source, formarts.get(0)); }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){ return parseDate(source, formarts.get(1)); }else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){ return parseDate(source, formarts.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, formarts.get(3)); }else { throw new IllegalArgumentException("Invalid boolean value '" + source + "'"); } } /** * 格式化日期 * @param dateStr String 字符型日期 * @param format String 格式 * @return Date 日期 */ public Date parseDate(String dateStr, String format) { Date date=null; try { DateFormat dateFormat = new SimpleDateFormat(format); date = dateFormat.parse(dateStr); } catch (Exception e) { logger.error("日期解析出错", e); } return date; } } **2.application/json JSON格式** 前端Content-Type 为application/json的请求时,我们使用@JsonFormat或者@JSONField来进行转化 Spring 默认是jackson 作为json格式化工具,因此在bean 属性标注@JsonFormat 即可,如果使用的是fastjson则标注@JSONField 当后台返回给前台的数据是json格式的时候,被标注@JsonFormat或者@JSONField注解的属性自动转换成日期字符串,因此这个可以解决返回的json日期数据是时间戳的问题
还没有评论,来说两句吧...