用AOP实现前端传参时间的时区转化

这篇具有很好参考价值的文章主要介绍了用AOP实现前端传参时间的时区转化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

新增注解

@Documented
@Target({FIELD,METHOD,PARAMETER,ANNOTATION_TYPE})
@Retention(RUNTIME)
public @interface MyDateFormatDeserializer {

    String pattern() default "yyyy-MM-dd HH:mm:ss";
    String oldPattern() default "yyyy-MM-dd HH:mm:ss";
}

新增AOP切面类

@Aspect
@Component
public class MyDateFormatDeserializerAspect {
    private static Logger log = LoggerFactory.getLogger(MyDateFormatDeserializerAspect.class);

    @Pointcut("execution(* com.jovision.vse.*.*.web.controller..*.*(..))")
    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("参数异常");

        }
    }

    private void convertObject(Object obj) throws IllegalAccessException {

        if (Objects.isNull(obj)) {
            log.info("当前需要转换的object为null");
            return;
        }
        String timeZoneStr = CurrentUserUtil.currentTimeZone();
        if(StringUtils.isNotBlank(timeZoneStr)){
            List<Field> fieldList = getSuperFields(obj.getClass(),true);
            for (Field field : fieldList) {
                boolean containFormatField = field.isAnnotationPresent(MyDateFormatDeserializer.class);
                if (containFormatField) {
                    //获取访问权
                    field.setAccessible(true);
                    MyDateFormatDeserializer annotation = field.getAnnotation(MyDateFormatDeserializer.class);
                    String oldPattern = annotation.oldPattern();
                    String newPattern = annotation.pattern();
                    Object dateValue = field.get(obj);
                    if (Objects.nonNull(dateValue) && !StringUtils.isEmpty(oldPattern) && !StringUtils.isEmpty(newPattern)) {
                        String newValue = StringUtils.EMPTY;
                        try {
                            Date date = new Date();
                            if(dateValue instanceof Date){
                                date = (Date) dateValue;
                            }else if(dateValue instanceof String){
                                date = DateUtils.parseDate(dateValue.toString(), oldPattern);
                            }else{
                                log.error("parse date error,@MyDateFormatDeserializer must String or Date !!!");
                                return;
                            }
                            SimpleDateFormat currentTime = new SimpleDateFormat(newPattern);
                            TimeZone timeZone = TimeZone.getTimeZone(timeZoneStr);
                            currentTime.setTimeZone(timeZone);
                            newValue = currentTime.format(date);
                        } catch (ParseException e) {
                            throw new RuntimeException(e);
                        }
                        log.info("aop transform success - oldValue = {}, newValue = {} ",dateValue , newValue);
                        field.set(obj, newValue);
                    }
                }
            }
        }

    }

    /**
     * 获取类的所有属性(含所有父级类)
     * @param clazz
     * @param containSuperClass
     * @return
     */
    private List<Field> getSuperFields(Class<?> clazz, boolean containSuperClass) {
        List<Field> fieldList = new ArrayList<>();
        //取父类属性
        while (clazz != null) {
            fieldList.addAll(Arrays.asList(clazz.getDeclaredFields())); //添加当前类全部属性
            if(containSuperClass){
                // 父类
                clazz = clazz.getSuperclass();
            }else{
                clazz = null;
            }
        }
        return fieldList;
    }
}

Controller传参字段添加注解

@Data
public class TestDto {
    /**
     * 查询的开始时间
     */
    @MyDateFormatDeserializer
    private String queryStartTime;
    /**
     * 查询的结束时间
     */
    @MyDateFormatDeserializer
    private String queryEndTime;
}

结束

这样,前端请求进到Controller后,开始执行业务逻辑之前,会将指定字段转化完时区并参与执行业务逻辑。文章来源地址https://www.toymoban.com/news/detail-638011.html

到了这里,关于用AOP实现前端传参时间的时区转化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【时区】Flink JDBC 和CDC时间字段时区 测试及时间基准

    关联文章: 各种时间类型和timezone关系浅析 1. 测试一般的数据库不含time zone的类型的时区。 mysql timestamp(3) 类型 postgres timestamp(3) 类型 sqlserver datetime2(3) 类型 oracle类型 TIMESTAMP(3) 类型 在以下测试之中均为 ts 字段 2.测试CDC中元数据 op_ts 时区 在以下测试中cdc表建表均使用 ts_ms T

    2024年02月06日
    浏览(32)
  • Flink SQL 时区 -- 时间字符串转时间戳并转换时区

    将时间字符串格式化,转变成时间戳,再加8小时后写入clickhouse (该方法默认精确度为秒,不适用毫秒) (1)UNIX_TIMESTAMP 作用:将时间字符串转换成时间戳 用法:UNIX_TIMESTAMP(STRING datestr, STRING format) (2)CONVERT_TZ 作用:转换时区 用法:CONVERT_TZ(string1, string2, string3) (实测仅获

    2024年02月04日
    浏览(40)
  • JAVA 时区时间相互转换

            //系统设置为UTC时区         System.setProperty(\\\"user.timezone\\\", \\\"UTC\\\");         //String dateString = \\\"2023-04-06T07:23:36.539767500\\\";         String dateString = \\\"2023-04-06T08:15:06.662Z\\\";         System.out.println(\\\"UTC 时间:\\\"+dateString.subSequence(0, dateString.length()));         String localDateTime1 = LocalD

    2024年02月16日
    浏览(28)
  • PostGreSQL:时间戳时区问题

            PostGreSQL数据库内置的时间类型如下,注意到:内置的时间类型被分为了with time zone-带时区、without time zone-不带时区两种类型,    time 、 timestamp 和 interval都可以 接受一个可选的精度值  p (取值:0-6),这个精度值声明在秒域中小数点之后保留的位数。缺省情况下

    2024年02月04日
    浏览(34)
  • NodaTime生成指定时区的时间

    最近遇到需要进行时区转换和获取/生成指定时区时间的需求。但网上大部分例子都是通过UTC时间或者DateTime.NtcNow或DateTime.Now实现的。但如果和第三方对接会出现对方只提供当地非当前时间且没带时区,这时候这些例子都不太满足需求,所以研究了一下用NodaTime来解决这个问题

    2024年02月14日
    浏览(25)
  • macOS修改默认时区显示中国时间

    默认时区不是中国,显示时间不是中国时间 打开终端 ,删除旧区,并复制新时区到etcreb sudo -rm -rf /etc/localtime sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 重启系统后时间显示为中国时间

    2024年01月21日
    浏览(28)
  • centos7设置时区,时间+时间同步的三种方式

    1.1查看当前时区: 1.2查看时间命令: 1.3选择时区命令 设置timezone的时区 3.1安装ntp 3.2启动ntp服务 3.3查看ntp服务 3.4修改ntp.conf文件 3.5重启服务 3.6检查同步状态 3.7执行硬件时间向软件时间同步 3.8查看当前时间 4.1最简单的方法,让所有集群中的主机跟某个时间服务器的 时间同步

    2024年02月04日
    浏览(37)
  • docker启动容器指定时区 解决mysql时间非北京时间问题

    运行docker镜像的时候可以指定环境变量TZ来设置使用那个时区的时间。如果不指定有些镜像在制作的时候设置了跟自己想用的时区不一样的时区就会出现尴尬的问题。 指定使用东八区时区命令如下: docker run -e TZ=Asia/Shanghai … docker启动mysql容器命令,指定库表编码:

    2024年02月14日
    浏览(35)
  • centos 系统下查看时间时区以及修改

    1.1查看系统时间 1.2将系统日期修改为2014-7-2 : 1.3系统时间设置为 上午10:20 1.4系统时区修改 1.4.1查看系统时区 1.4.2修改时区(将上海改为系统时区) 提示是否要覆盖,输入y 确定 在Centos 7 中引入了一个叫 timedatectl 的设置设置程序.用法很简单: 2.1将硬件时钟调整为与本地时钟

    2024年02月11日
    浏览(40)
  • Jackson(二):@JsonFormat时间格式及时区问题

    今天遇到一个查了很久的问题,具体表现为前端传过来的时间参数的时区是+0800,我用Jackson反序列化成对象时,时间解析出来还是正确的,但是我再将对象序列化为Json数据时时区又变成了+0000时区,导致前端出现了问题,但是服务器上用命令date看时,时区也是正确的。解决后

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包