搞懂@DateTimeFormat 注解 和 对应的时间类型

news2024/11/25 4:45:34

通常而言,前端时间控件,一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。如果我们直接用java.util.Date类型来接收,是无法获取的。这是因为Date类型默认的格式为:Tue May 16 00:00:00 CST 2023这种。

举例

    @ApiOperation(value = "后端不限制格式,用Date接收")
    @GetMapping("t111")
    public Result t111(
            @RequestParam
            Date date
    ){
        System.out.println(date);
        return Result.success(date);
    }

2023-05-16 23:53:54.053  WARN 7844 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam java.util.Date] for value '2023-05-16'; nested exception is java.lang.IllegalArgumentException]

但是如果按Date的默认格式传递就ok。 

要想解决这个问题,那么我们就需要在接收参数上使用到@DateTimeFormat注解。然后pattern属性来定义我们接收参数的格式规则。只要前端传递的参数符合该规则,就能被接收,否则就会报错。

    @ApiOperation(value = "日期_1")
    @GetMapping("t22")
    public Result t22(
            @RequestParam
            @DateTimeFormat(pattern = "yyyy-MM-dd")
            Date date
    ){
        System.out.println(date);
        return Result.success(date);
    }

注意:如果我们用String字符串来接收,那么@DateTimeFormat是无法限制的,因为@DateTimeFormat只对时间日期类型生效。

下面,我们再来结合不同参数类型,演示接收时间日期的效果。

代码演示

package com.hssy.swaggerdemo.controller;

import com.hssy.swaggerdemo.common.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;

@RestController
@Api(tags = "时间日期练习控制器")
@RequestMapping("/dateTime")
public class DateTimeController {

    @ApiOperation(value = "时间日期")
    @GetMapping("t1")
    public Result t1(
            @RequestParam
            @DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")// 限制前端传递的格式,格式必须带有日期和时间,其他可选
            LocalDateTime localDateTime
    ){
        System.out.println(localDateTime);
        return Result.success(localDateTime);
    }


    @ApiOperation(value = "日期")
    @GetMapping("t2")
    public Result t2(
            @RequestParam
            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 限制前端传递的格式,格式一定要带有日期,其他可选
            LocalDate localDate
    ){
        System.out.println(localDate);
        return Result.success(localDate);
    }


    @ApiOperation(value = "时间")
    @GetMapping("t3")
    public Result t3(
            @RequestParam
            @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // 限制前端传递的格式,格式一定要带有时间,其他可选
            LocalTime localTime
    ){
        System.out.println(localTime);
        return Result.success(localTime);
    }




    @ApiOperation(value = "时间日期_1")
    @GetMapping("t11")
    public Result t11(
            @RequestParam
            @DateTimeFormat(pattern = "HH:mm:ss yyyy-MM-dd")
            Date date
    ){
        System.out.println(date);
        return Result.success(date);
    }


    @ApiOperation(value = "日期_1")
    @GetMapping("t22")
    public Result t22(
            @RequestParam
            @DateTimeFormat(pattern = "yyyy-MM-dd")
            Date date
    ){
        System.out.println(date);
        return Result.success(date);
    }


    @ApiOperation(value = "时间_1")
    @GetMapping("t33")
    public Result t33(
            @RequestParam
            @DateTimeFormat(pattern = "HH:mm:ss")
            Date date
    ){
        System.out.println(date);
        return Result.success(date);
    }
}

总结

@DateTimeFormat 用来规定前端传递的时间日期的格式。

@DateTimeFormat 注解的pattern规则,规定了前端传递是参数必须符合该规则,否则报错。

当使用java.util.Date类型接收参数时,无论@DateTimeFormat的格式是只带有时间还是只带有日    期,或者都带有,Date对象都能够解析到。遇到没有传递的部分会自动解析为默认值。

比如:     如果格式要求 yyyy-MM-dd,那么时间默认解析为 00:00:00

                如果格式要求 HH:mm:ss,那么日期默认解析为 1970-01-01

当使用java.time.LocalDateTime接收参数时,@DateTimeFormat的格式必须带有时间和日期,否则无法解析到。

当使用java.time.LocalDate接收参数时,@DateTimeFormat的格式必须包含日期,其他可选。

当使用java.time.LocalTime接收参数时,@DateTimeFormat的格式必须包含时间,其他可选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Games104现代游戏引擎学习笔记08

渲染那部分看的云里雾里的,等学完其他图形学的内容再回头开吧 游戏动画的三个挑战: 1.根据交互实时的反应各种变化 2.一帧时间里的庞大计算 3.更真实自然的表现 2D动画 sprite animation 把每一帧精灵循环绘制出来 2D技术实现3D效果 在各个视角采了一…

shell脚本——流编辑器“三剑客”之awk命令

shell脚本——流编辑器“三剑客”之awk命令 一、awk1、工作原理2、命令格式3、awk常见的内建变量(可直接用)4、按行输出文本5、按字段输出文本’:’6、通过管道、双引号调用shell命令 一、awk 1、工作原理 逐行读取文本,默认以空格或TAB键为…

射频放大器的原理和作用(射频放大器和功率放大器的区别)

射频放大器是一种电子电路,用于将输入信号增强到足够高的电平以驱动射频输出负载。其原理和作用如下: 射频放大器的工作原理是利用晶体管的三极管效应,将输入信号放大到足够的电平以驱动输出负载。在射频放大器中,输入信号经过输入…

深入理解 python 虚拟机:破解核心魔法——反序列化 pyc 文件

深入理解 python 虚拟机:破解核心魔法——反序列化 pyc 文件 在前面的文章当中我们详细的对于 pyc 文件的结构进行了分析,pyc 文件主要有下面的四个部分组成:魔术、 Bite Filed 、修改日期和 Code Object 组成。在前面的文章当中我们已经对前…

Android NDK: 使用Python生成下载地址

文章目录 1. 目的2. NDK下载链接3. 生成链接的 Python 脚本4. Bonus: 生成表格的 Python 脚本 1. 目的 Android NDK 的 github wiki 中给出了部分历史版本 NDK 的下载地址,有些版本的下载地址并没有在网页中给出。实际上这些下载地址很有规律。本文给出具体的链接&…

无人水面艇声呐装备现状与发展趋势(水声功率放大器)

无人水面艇声呐装备是目前海洋探测和水下情报收集的重要工具,其发展趋势受到了国防、军事、海洋资源勘探等领域的广泛关注。本文将介绍当前无人水面艇声呐装备的现状以及未来的发展趋势。 一、现状 无人水面艇声呐装备主要应用于水下物体的探测和测量,其…

NDK OpenGL仿抖音极快极慢录制特效视频

NDK​系列之OpenGL仿抖音极快极慢录制特效视频,本节主要是在上一节OpenGL代码架构上增加极快极慢等特效的视频录制功能。 实现效果: 实现逻辑: 在上一节的特效效果的基础上,使用MediaCodec和自定义EGL,将效果视频录制…

CountDownLatch与Binder连接池

CountDownLatch与Binder连接池 CountDownLatch 如果现在有一个题,有5个数,这时候我想让这5个数同时都乘2,然后算出结果后再算它们的平均数 这时候就可以用CountDownLatch import java.util.concurrent.CountDownLatch; public class Example {public static void main(Stri…

总结853

学习目标: 月目标:5月(张宇强化前10讲,背诵15篇短文,熟词僻义300词基础词) 周目标:张宇强化前3讲并完成相应的习题并记录,英语背3篇文章并回诵 每日必复习(5分钟&#…

leetcode(力扣)刷题笔记(c++)【下】

文章预览: 单调栈739. 每日温度496.下一个更大元素 I503. 下一个更大元素 II42. 接雨水84.柱状图中最大的矩形 额外题目1365.有多少小于当前数字的数字941. 有效的山脉数组1207. 独一无二的出现次数189. 轮转数组724. 寻找数组的中心下标922. 按奇偶排序数组 II 后续…

软考高级架构师笔记-3数据库

目录 1. 前言 & 更新2. 数据库基本概念3. E-R图与二维表4. 约束、范式5. 数据库新技术1. 前言 & 更新 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师笔记-2计算机软件(操作系统)本章考情: 数据库章节都会考3-5分左右,第二版教材上对应2.3.3和6,主要考…

软考A计划-真题-分类精讲汇总-第十四章(数据流图)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Python每日一练(20230517) 最大连续1的个数 I\II\III

目录 1. 最大连续1的个数 I Max Consecutive Ones 🌟 2. 最大连续1的个数 II Max Consecutive Ones 🌟🌟 3. 最大连续1的个数 III Max Consecutive Ones 🌟🌟 🌟 每日一练刷题专栏 🌟 G…

RabbitMQ养成记 (5. MQ的topics模式)

主题模式 Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符! Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割&a…

【夜莺(Flashcat)V6监控】2.夜莺告警相关: 多服务器多业务配置

介绍 本章侧重点是应用,根据大家不同业务、服务器部署众多等等;根据不同团队,不同业务进行划分;方便不同的团队负责自己职责内的工作; 比如我们场景如下: 三块业务:人工智能、医药、团购&…

分层强化学习 学习笔记

分层强化学习代码汇总 0.综述 《The Promise of Hierarchical Reinforcement Learning》分层强化学习的前景 强化学习 强化学习问题的设置: 有两个主角:一个代理和一个环境。环境是代理所生活和交互的地方。在每一次交互中,代理都能看到世…

深度解析:5G与未来天线技术 5G通信到底需要什么样的天线?

过去二十年,我们见证了移动通信从1G到4G LTE的转变。在这期间,通信的关键技术在发生变化,处理的信息量成倍增长。而天线,是实现这一跨越式提升不可或缺的组件。 按照业界的定义,天线是一种变换器,它把传输…

一图看懂 et_xmlfile 模块:一个用于创建大型XML文件的低内存库,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 et_xmlfile 模块:一个用于创建大型XML文件的低内存库,资料整理笔记(大全) 🧊摘要🧊解释&#x1f9ca…

网络进阶学习:子网掩码及VLAN划分

网络进阶学习:子网掩码及VLAN划分 什么是子网?什么是子网掩码?什么是VLAN子网掩码和VLAN的关系小结 什么是子网? ⭐子网是将一个大的IP地址段划分成若干个小的IP地址段的网络。子网可以帮助网络管理员更好地管理网络,…

reids学习--redis常用命令

字符串string操作命令 Redis中字符串类型常用命令: 操作描述set key value设置指定key的值get key获取指定key的值setex key seconds value设置指定key的值,并将key的过期时间设为seconds秒(可用于验证码登录)setnx key value只有在key不存在时设置key…