springboot中,前端传时间戳后端用LocalDateTime接收

2023-11-08

问题:字符串/时间戳入参-》后端LocalDateTime

  1. 单个时间戳入参
public class LocalDateTimeArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(LocalDateTime.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        String parameterName = methodParameter.getParameterName();
        if (Objects.nonNull(parameterName)) {
            String parameter = nativeWebRequest.getParameter(parameterName);
            if (Objects.nonNull(parameter)) {
                return LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(parameter)), ZoneId.systemDefault());
            }
        }

        return null;
    }
}

@Configuration
public class CustomDateConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new LocalDateTimeArgumentResolver());
        // .....
    }

}

http://localhost:22222/dateTest3?localDateTime=1671360603000

  1. 多个参数,里面包含时间戳
package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;

import javax.validation.constraints.NotNull;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

@Configuration
public class DateTimeConfig {

    /** 默认日期时间格式 */
    public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    /** 默认日期格式 */
    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
    /** 默认时间格式 */
    public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

    /**
     * 日期正则表达式
     */
    private static final String DATE_REGEX = "[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])";

    /**
     * 时间正则表达式
     */
    private static final String TIME_REGEX = "(20|21|22|23|[0-1]\\d):[0-5]\\d:[0-5]\\d";

    /**
     * 日期和时间正则表达式
     */
    private static final String DATE_TIME_REGEX = DATE_REGEX + "\\s" + TIME_REGEX;

    /**
     * 13位时间戳正则表达式
     */
    private static final String TIME_STAMP_REGEX = "1\\d{12}";

    /**
     * 年和月正则表达式
     */
    private static final String YEAR_MONTH_REGEX = "[1-9]\\d{3}-(0[1-9]|1[0-2])";

    /**
     * 年和月格式
     */
    private static final String YEAR_MONTH_PATTERN = "yyyy-MM";

    /**
     * LocalDateTime转换器,用于转换RequestParam和PathVariable参数
     */
    @Bean
    public Converter<String, LocalDateTime> localDateTimeConverter() {
        return new Converter<String, LocalDateTime>() {
            @Override
            public LocalDateTime convert(@NotNull String source) {
                if (source.matches(TIME_STAMP_REGEX)) {
                    return LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.systemDefault());
                } else if (source.matches(DATE_TIME_REGEX)) {
                    return LocalDateTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT));
                } else {
                    return null;
                }
            }
        };
    }
    
    /**
     * LocalDate转换器,用于转换RequestParam和PathVariable参数
     */
    @Bean
    public Converter<String, LocalDate> localDateConverter() {
        return new Converter<String, LocalDate>() {
            @Override
            public LocalDate convert(@NotNull String source) {
                if (source.matches(TIME_STAMP_REGEX)) {
                    return LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.systemDefault()).toLocalDate();
                } else if (source.matches(DATE_REGEX)) {
                    return LocalDate.parse(source, DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT));
                } else {
                    return null;
                }
            }
        };
    }

    /**
     * LocalTime转换器,用于转换RequestParam和PathVariable参数
     */
    @Bean
    public Converter<String, LocalTime> localTimeConverter() {
        return new Converter<String, LocalTime>() {
            @Override
            public LocalTime convert(@NotNull String source) {
                if (source.matches(TIME_STAMP_REGEX)) {
                    return LocalDateTime.ofInstant(Instant.ofEpochMilli(Long.parseLong(source)), ZoneId.systemDefault()).toLocalTime();
                } else if (source.matches(TIME_REGEX)) {
                    return LocalTime.parse(source, DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT));
                } else {
                    return null;
                }
            }
        };
    }

    /**
     * Date转换器,用于转换RequestParam和PathVariable参数
     */
    @Bean
    public Converter<String, Date> dateConverter() {
        return new Converter<String, Date>() {
            @Override
            public Date convert(@NotNull String source) {
                SimpleDateFormat format = new SimpleDateFormat(DEFAULT_DATE_TIME_FORMAT);
                try {
                    return format.parse(source);
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        };
    }

}
public class DateTestDTO implements Serializable {

    private Long id;
    private LocalDateTime localDateTime;
    private LocalDate localDate;
	// obmit getter and setter...
}

// TestController..
@PostMapping(value = "/dateTest3")
@ResponseBody
public LocalDateTime dateTest3(DateTestDTO dto) {
    System.out.println(dto);
    return dto.getLocalDateTime();
}

http://localhost:22222/dateTest3?id=1671360603000&localDateTime=1671360603000

具体参考:springboot中的参数解析器,参数解析的过程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot中,前端传时间戳后端用LocalDateTime接收 的相关文章

  • Java 8 可选

    我想检查特定对象大小是否大于 0 如果它大于 0 那么我想创建一个可选对象 如果不是 那么我想返回一个可选的空对象 这是java代码的长版本 if fooA size gt 0 return Optional of new Foo else
  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • 将 java 方法参数设置为最终参数

    那有什么区别final在下面的代码之间进行 将参数声明为有什么好处final public String changeTimezone Timestamp stamp Timezone fTz Timezone toTz return pu
  • 如何知道内存中是否已经存在类的实例?

    如何知道内存中是否已经存在类的实例 我的问题是 如果存在类实例 则不想读取方法 这是我的代码 private void jButton java awt event ActionEvent evt PNLSpcMaster pnlSpc n
  • 内部/匿名类的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 匿名类和静态内部类的最佳实践 设计和性能方面 是什么 就我个人而言 我认为静态内部类提供了更好的封装 并且应该提供更好的性能 因为它们无法访问类
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

    我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试 问题是相同的代码在 2 7 7 中适用于 spring boot 但在 3 0 0 中不适用于 spring boot 问
  • Android 的@hide 注解到底有什么作用?

    Android中很多内部API都被标记出来了 hide What exactly这是吗 另一个答案 https stackoverflow com questions 17035271 what does hide mean in the
  • 相对重力

    我最近开始使用jMonkey引擎 这非常好 但我在尝试实现相对重力时陷入了困境 我想让行星彼此围绕轨道运行 不一定是完美的圆形轨道 取决于速度 所以每个对象都应该影响其他对象 我现在拥有的 关闭全球重力 bulletAppState get
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • 错误包括 bouncycastle 提供商

    我需要使用bouncycastle provider我的项目中的库 我已将其包含在 gradle 项目中 apply plugin application sourceCompatibility 1 6 version 1 0 0 main
  • 将序列化数据发送到 servlet 时出现 java.io.EOFException

    我正在尝试从 Java 本地应用程序上传一个包含文件到服务器的对象 我的计划是 在 tomcat 上运行的 servlet 将使用以下方法获取对象ObjectInputStream in the doGet方法 但我得到一个EOFExcep
  • 为什么我无法使用 HttpUrlConnection 上传第一个文件块?

    在我的项目中 我应该从一台服务器逐块下载文件 并将每个块立即上传到另一台服务器 我有一个应该下载的文件的 URL 我们就这样称呼它吧downloadUrl 因此 这就是我逐块下载文件的方式 val chunkSize 1024 1024 B
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • 致命异常:OkHttp 调度程序

    我在 Android 应用程序中使用 OkHttp 库向天气 API 发出 Web 请求 我已经实现了我的代码 但在执行请求时遇到了致命异常 我也已经在我的清单中添加了互联网权限 MainActivity java private Curr
  • 优雅地避免 Java 中的 NullPointerException

    考虑这一行 if object getAttribute someAttr equals true 显然这一行是一个潜在的错误 属性可能是null我们会得到一个NullPointerException 因此我们需要将其重构为以下两个选择之一
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • python 爬取中国木材价格指数网

    python 爬取中国木材价格指数网 完整代码 https github com tanjunchen SpiderProject tree master yuzhuprice usr bin env python coding utf 8
  • 分布式事务方案整理

    分布式系统有一个著名的CAP理论 即一个分布式系统要同时满足一致性 Consistency 可用性 Availablility 和分区容错 Partition Tolerance 三个特性是一件不可能的事情 CAP理论告诉架构师不要妄想设计
  • python笔记记录神器 jupyter notebook

    之前因为没有用到这款python工具 所以一直没有在号内给大家介绍 实则大部分python开发者已经在使用了 最喜欢它的地方是可以同时支持markdown和ipython的脚本脚本 那就意味着我可以一遍调试我的代码一遍加上每一部分的层级标题
  • RPA如何拓展更多实体应用场景,进一步精益流程管理?

    RPA作为一种灵活 高效 成本可控的数字化转型方式 已成为近年来关注度最高的技术趋势之一 作为企业转型的催化剂 以RPA为代表的 数字员工 通过预先构建的 智能的 高生产率的 自组织的 多任务资源等方式 能够独特地使用和访问与人类相同的IT
  • 存储结构分四类:顺序存储、链接存储、索引存储 和 散列存储

    转载 http www cnblogs com fengty90 p 3768826 html 存储结构分四类 顺序存储 链接存储 索引存储 和 散列存储 顺序结构和链接结构适用在内存结构中 顺序表每个单元都是按物理顺序排列的 如果你想访问
  • Halcon清晰度检测实例(转)

    Halcon清晰度检测实例 转 2013 10 08 14 11 07 分类 halcon 举报 字号 订阅 下载LOFTER 我的照片书 此实例通过使用Halcon实现5种清晰度算法函数 1 方差算法函数 2 拉普拉斯能量函数 3 能量梯
  • kubernetes 容器获取宿主机IP

    容器如何获取到所运行的kubernetes节点IP env name HOST NODE NAME valueFrom fieldRef apiVersion v1 fieldPath spec nodeName name HOST NOD
  • 初次在idea运行ssm框架项目

    JDK 8 Tomcat 8 Maven 最新的 配环境变量 Git IDEA 安装 陪环境 编码 UTF 8 快捷方式 把自己安装的JDK Tomcat Maven git配置到IDEA中 自己下一些插件 从GitHub上倒入项目 Mav
  • 概率论与数理统计——方差分析

    文章目录 单因素试验的方差分析 单因素试验 双因素试验的方差分析 方差分析是数理统计中应用很广泛的内容 主要看两个 单因素试验的方差分析 双因素试验的方差分析 在这之前先了解几个概念 方差分析 根据试验的结果进行分析 鉴别各个有关因素对试验
  • ERP财务基础学习

    总账的账套包括会计期间 会计科目和本位币的定义 会计期间 Accounting Period Fiscal Period 又称会计分期 是指将企业川流不息的经营活动划分为若干个相等的区间 在连续反映的基础上 分期进行会计核算和编制会计报表
  • Linux定时任务-定时执行Shell脚本

    主要是使用Linux的crontab工具来实现的 有两个方法 一个放在contab 列表里面 另一个是放在contab文件里面 其实原理是一致的 crontab 列表 cd tmp 创建一个shell脚本 vim hello sh bin
  • ABAP动态编程-动态调用子例程&方法及动态SQL

    目录 前言 一 动态调用 1 1 FORM子例程的动态调用 1 2 ABAP方法动态调用 二 动态SQL 2 1 动态OPEN SQL语句 2 2 使用ADBC类执行SQL 总结 前言 本文主要讲述ABAP语言中FORM子例程 方法的动态调
  • element-ui 多选框和级联选择的部分bug以及解决方法

    前言 最近在开发一款使用了 element ui 的低代码设计器 在开发的过程当中碰到了一些关于 element ui 组件本身不合理的地方 并且在百度的基础上自己去阅读了一下 element ui 的源码 也找出了这些问题的一个解决方案
  • EDA虚拟机安装 plus

    EDA虚拟机安装 plus 申明 此工具为学生或者初学者学习只用 严谨用于商业用途 请支持知识产权 购买正版EDA工具 之前刚安装了一个虚拟机 详见 EDA大礼包 本想将之前的开源NanGate 45nmPDK用于后端实现 但找到的库全部基
  • R中Matrix and TMB package version issues

    在Rstudio中常遇到Matrix and TMB包版本的问题 或者是其他类似的问题 Warning message In checkMatrixPackageVersion Package version inconsistency d
  • SSM项目-在线考试系统的Java毕业设计(附论文+源码)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 Java毕业设计 精彩专栏推荐 安卓app毕业设计 微信小程序毕业设计 演示视频 ssm061在线考试系统 源码下载地址 https download csdn net do
  • HTTP协议的基本概念与理解!

    一 什么是HTTP协议 HTTP 超文本传输协议 是一个基于请求与响应 无状态的 应用层的协议 常基于TCP IP协议传输数据 互联网上应用最为广泛的一种网络协议 所有的WWW文件都必须遵守这个标准 设计HTTP的初衷是为了提供一种发布和接
  • vue element的select下拉框赋值之后无法选择

    问题描述 用element的select下拉框之后 在回显后有初始值的情况下 不能修改 也不能选择 如图 明明点击了一般内勤主管 但没有任何反应
  • C语言:九九乘法表

    题目描述 已知九九乘法表 要求给定在1 9之间的整数n 输出该表的前n行 输入 包含多行 每行一个在1 9之间的整数n 输出 输出九九乘法表的前n行 include
  • springboot中,前端传时间戳后端用LocalDateTime接收

    问题 字符串 时间戳入参 后端LocalDateTime 单个时间戳入参 public class LocalDateTimeArgumentResolver implements HandlerMethodArgumentResolver