前言
场景
前端传过来的时间参数,我们后端自定义时间格式转化使用,想转成什么就转成什么。
不同业务场景,跟前端对接,一种控件基本时间参数是固定格式的,为了避免前端去转换时间参数的格式,跟前端约定好,让他们固定传递一种格式,后端自己看需求转换格式使用即可。
效果
① 从 yyyy-MM-dd HH:mm:ss 转换成 yyyy-MM-dd 使用:
② 从 yyyyMMddHHmmss 转换成 yyyy-MM-dd HH:mm:ss 使用:
③不再举例,其实就是自己想怎么转就怎么转。
实战
pom.xml (aop依赖、lombok依赖):
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
|
< dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-web</ artifactId > </ dependency > < dependency > < groupId >org.projectlombok</ groupId > < artifactId >lombok</ artifactId > < version >1.18.20</ version > < scope >compile</ scope > </ dependency > < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-aspects</ artifactId > < version >5.2.7.RELEASE</ version > </ dependency > < dependency > < groupId >org.aspectj</ groupId > < artifactId >aspectjtools</ artifactId > < version >1.9.5</ version > </ dependency > < dependency > < groupId >aopalliance</ groupId > < artifactId >aopalliance</ artifactId > < version >1.0</ version > </ dependency > < dependency > < groupId >org.aspectj</ groupId > < artifactId >aspectjweaver</ artifactId > < version >1.9.0</ version > </ dependency > < dependency > < groupId >cglib</ groupId > < artifactId >cglib</ artifactId > < version >3.3.0</ version > </ dependency > |
核心(自定义注解+拦截器):
自定义注解一
DateField.java
用途: 用于标记哪个字段需要进行时间格式转换,配置旧格式,新格式(都可写默认值)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Author: JCccc * @Date: 2022-4-11 18:45 * @Description: */ @Target ({ElementType.METHOD, ElementType.FIELD}) @Retention (RetentionPolicy.RUNTIME) public @interface DateField { String oldPattern() default DateUtil.YYYY_MM_DD_HH_MM_SS; //新格式可以写默认也可以不写,如果业务比较固定,那么新时间格式和旧时间格式都可以固定写好 String newPattern() default "" ; } |
自定义注解二
NeedDateFormatConvert.java
用途: 用于标记哪个接口需要进行AOP方式 时间格式转换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Author: JCccc * @Date: 2022-4-11 18:44 * @Description: */ @Target ({ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) public @interface NeedDateFormatConvert { } |
拦截器
DateFormatAspect.java
用途: 核心转换实现逻辑。
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
import com.jctest.dotestdemo.util.DateUtil; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.lang.reflect.Field; import java.util.Objects; /** * @Author: JCccc * @Date: 2022-4-11 18:57 * @Description: */ @Aspect @Component public class DateFormatAspect { private static Logger log = LoggerFactory.getLogger(DateFormatAspect. class ); @Pointcut ( "@annotation(com.jctest.dotestdemo.aop.dateFormat.NeedDateFormatConvert)" ) public void pointCut() { } @Around ( "pointCut()" ) public Object around(ProceedingJoinPoint joinPoint) throws Throwable { //转换 dateFormat(joinPoint); return joinPoint.proceed(); } public void dateFormat(ProceedingJoinPoint joinPoint) { Object[] objects = null ; try { objects = joinPoint.getArgs(); if (objects.length != 0 ) { for ( int i = 0 ; i < objects.length; i++) { //当前只支持判断对象类型参数 convertObject(objects[i]); } } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException( "参数异常" ); } } /** * 转换对象里面的值 * * @param obj * @throws IllegalAccessException */ private void convertObject(Object obj) throws IllegalAccessException { if (Objects.isNull(obj)) { log.info( "当前需要转换的object为null" ); return ; } Field[] fields = obj.getClass().getDeclaredFields(); for (Field field : fields) { boolean containFormatField = field.isAnnotationPresent(DateField. class ); if (containFormatField) { //获取访问权 field.setAccessible( true ); DateField annotation = field.getAnnotation(DateField. class ); String oldPattern = annotation.oldPattern(); String newPattern = annotation.newPattern(); Object dateValue = field.get(obj); if (Objects.nonNull(dateValue) && StringUtils.hasLength(oldPattern) && StringUtils.hasLength(newPattern)) { String newDateValue = DateUtil.strFormatConvert(String.valueOf(dateValue), oldPattern, newPattern); if (Objects.isNull(newDateValue)){ log.info( "当前需要转换的日期数据转换失败 dateValue = {}" ,dateValue.toString()); throw new RuntimeException( "参数转换异常" ); } field.set(obj, newDateValue); } } } } } |
工具类
DateUtil.java
用途: 时间格式转换函数、定义各种时间格式。
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
|
import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * @Author: JCccc * @Date: 2022-4-1 14:48 * @Description: */ @Slf4j public class DateUtil { public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss" ; public static final String YYYY_MM_DD = "yyyy-MM-dd" ; public static final String YYYY_MM = "yyyy-MM" ; public static final String YYYY = "yyyy" ; public static final String MM = "MM" ; public static final String DD = "dd" ; public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss" ; public static final String YYYYMMDD = "yyyyMMdd" ; /** * 指定日期格式转换 * * @param dateStr * @param oldPattern * @return */ public static String strFormatConvert(String dateStr, String oldPattern,String newPattern) { try { DateTimeFormatter oldFormatter = DateTimeFormatter.ofPattern(oldPattern); DateTimeFormatter newFormatter = DateTimeFormatter.ofPattern(newPattern); return LocalDateTime.parse(dateStr, oldFormatter).format(newFormatter); } catch (Exception e) { log.error( "strToDate is Exception. e:" , e); return null ; } } } |
使用
UserQueryVO.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import com.jctest.dotestdemo.aop.dateFormat.DateField; import com.jctest.dotestdemo.util.DateUtil; import lombok.Data; import java.io.Serializable; /** * @Author: JCccc * @Date: 2022-4-1 14:48 * @Description: */ @Data public class UserQueryVO implements Serializable { /** * 开始时间 */ @DateField (oldPattern =DateUtil.YYYY_MM_DD_HH_MM_SS, newPattern = DateUtil.YYYY_MM_DD) private String startDate; /** * 结束时间 */ @DateField (oldPattern =DateUtil.YYYY_MM_DD_HH_MM_SS,newPattern = DateUtil.YYYY_MM_DD) private String endDate; } |
接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import com.jctest.dotestdemo.aop.dateFormat.NeedDateFormatConvert; import com.jctest.dotestdemo.vo.UserQueryVO; import org.springframework.web.bind.annotation.*; /** * @Author: JCccc * @Date: 2022-4-18 11:52 * @Description: */ @RestController public class UserController { @NeedDateFormatConvert @PostMapping ( "/test" ) public String test( @RequestBody UserQueryVO userQueryVO){ System.out.println( "时间格式转化完成:" ); System.out.println(userQueryVO.getStartDate()); System.out.println(userQueryVO.getEndDate()); return userQueryVO.toString(); } } |
调用
以上就是Springboot+AOP实现时间参数格式转换的详细内容,更多关于Springboot时间格式转换的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/qq_35387940/article/details/124488501