日期时间参数,格式配置(SpringBoot)

news2024/11/15 9:01:30

介绍

在SpringBoot项目中,接口中的日期和时间类型的参数,配置格式。

日期格式

接口中常用的日期时间格式有两种:

  1. 字符串(比如:yyyy-MM-dd HH:mm:ss)
  2. 时间戳(比如:1696839876955)

这两种方式各有优势。

  • 字符串格式表示时间,直观清晰,便于识别出时间。但是,字符串格式存在时区问题,需要在字段中描述出时区(SpringMVC的默认时间格式中带有时区),或者前后端规定好默认时区,比如东八区(GMT+8)。
  • 时间戳,用数字表示时间,准确定位时间,不存在时区问题。缺点是,不够直观,无法直接识别出时间戳对应的具体时间(需要转换),不便于从接口直接判断时间是否正确,测试比较费时费力。

格式配置

日期参数的格式,可以配置。分为:全局配置局部配置

  • 全局配置:作用于项目全局的时间参数。
  • 局部配置:只作用于配置的字段,覆盖全局配置,其余字段不受影响。

全局配置

Query时间入参,使用字符串

配置

spring:
  mvc:
    format:
      # Query参数,时间格式(转换 java.util.Date)
      date: yyyy-MM-dd HH:mm:ss

Query参数实体示例

Query参数,使用 java.util.Date 类型接收。

package com.example.web.exception.query;

import com.example.core.validation.phone.query.PhoneQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springdoc.api.annotations.ParameterObject;

import java.util.Date;

@Data
@ParameterObject
@Schema(name = "用户Query")
public class UserQuery {

    // 其他字段

    @Schema(description = "开始时间", example = "2023-01-01 08:30:00")
    private Date beginTime;

    @Schema(description = "结束时间", example = "2023-12-31 17:00:00")
    private Date endTime;

}

接口调用成功

日期格式正确,接口调用成功。

在这里插入图片描述

打印日志:

查询用户列表。userQuery=UserQuery(name=null, phone=null, beginTime=Sun Jan 01 08:30:00 GMT+08:00 2023, endTime=Sun Dec 31 17:00:00 GMT+08:00 2023, beginDate=null, endDate=null),pageQuery=PageQuery(pageNumber=1, pageSize=10)

接口调用失败

接口输入必须符合格式,否则会调用失败(报出异常)。
在这里插入图片描述

Body时间入参和响应时间出参

默认响应中的时间参数,会转换成字符串,默认时间格式举例:

2023-10-10T01:31:03.279+00:00

配置

目标格式为:yyyy-MM-dd HH:mm:ss,东八区。

spring:
  jackson:
    # Body参数和响应,时间格式(转换 java.util.Date)
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

Body时间入参:UserEditParam

package com.example.web.response.model.param;

import com.example.core.validation.phone.strict.Phone;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.Date;

@Data
@Schema(name = "编辑用户Param")
public class UserEditParam {

    // 其他字段

    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "开始日期", example = "2023-01-01")
    private Date beginDate;

    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "结束日期", example = "2023-12-31")
    private Date endDate;

}

效果

接口调用:
在这里插入图片描述
控制台打印参数:

新增用户,Post请求。param=UserAddParam(name=张三, phone=18612345678, email=zhangsan@example.com, beginTime=Sun Jan 01 08:30:00 CST 2023, endTime=Sun Dec 31 17:00:00 CST 2023)

响应时间出参:UserVO

package com.example.web.model.vo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.util.Date;

@Data
@Schema(name = "用户VO")
public class UserVO {

    // 其他字段

    @Schema(description = "开始时间", example = "2023-01-01 01:20:30")
    private Date beginTime;

    @Schema(description = "结束时间", example = "2023-01-01 01:20:30")
    private Date endTime;

}

效果

在这里插入图片描述

响应时间出参:时间戳

配置

spring:
  jackson:
    serialization:
      # 时间字段(java.util.Date),返回时间戳。注意,此配置会覆盖掉 spring.jackson.date-format 。
      write-dates-as-timestamps: true

效果

响应时间出参,为时间戳格式。

在这里插入图片描述

局部配置

Query时间入参:局部格式

Query时间入参,如果某个字段需要的时间格式和全局不相同,可以配置这个字段的自定义的入参格式。

使用注解:@DateTimeFormat

配置示例

package com.example.web.exception.query;

import com.example.core.validation.phone.query.PhoneQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springdoc.api.annotations.ParameterObject;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

@Data
@ParameterObject
@Schema(name = "用户Query")
public class UserQuery {

    // 其他字段

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "开始日期", example = "2023-01-01")
    private Date beginDate;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "结束日期", example = "2023-12-31")
    private Date endDate;

}

效果

在这里插入图片描述

Body时间入参:局部格式

使用注解:@JsonFormat

配置示例

package com.example.web.response.model.param;

import com.example.core.validation.phone.strict.Phone;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import java.util.Date;

@Data
@Schema(name = "编辑用户Param")
public class UserEditParam {

    // 其他字段

    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "开始日期", example = "2023-01-01")
    private Date beginDate;

    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "结束日期", example = "2023-12-31")
    private Date endDate;

}

效果

在这里插入图片描述

编辑用户,PUT请求。id=1234567890123456789,param=UserEditParam(name=张三, phone=18612345678, email=zhangsan@example.com, beginDate=Sun Jan 01 00:00:00 CST 2023, endDate=Sun Dec 31 00:00:00 CST 2023)

问题

注意:如下图传递参数,接口也能调用成功。
接口收到的参数,只包含年月日。

编辑用户,PUT请求。id=1234567890123456789,param=UserEditParam(name=张三, phone=18612345678, email=zhangsan@example.com, beginDate=Sun Jan 01 00:00:00 CST 2023, endDate=Sun Dec 31 00:00:00 CST 2023)

在这里插入图片描述

在这里插入图片描述

响应时间出参:局部格式

使用注解:@JsonFormat

配置示例

package com.example.web.model.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.util.Date;

@Data
@Schema(name = "用户VO")
public class UserVO {

    // 其他字段

    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "开始日期", example = "2023-01-01")
    private Date beginDate;

    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "结束日期", example = "2023-12-31")
    private Date endDate;

}

效果

在这里插入图片描述

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

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

相关文章

【云计算网络安全】僵尸网络详解:工作原理、控制和保护方法

文章目录 一、什么是僵尸网络?二、僵尸网络因为什么原因而诞生?三、僵尸网络主要用途四、僵尸网络如何工作?五、如何控制僵尸网络?5.1 客户端/服务器僵尸网络模型5.1.1 星形网络拓扑5.1.2 多服务器网络拓扑5.1.3 分层网络拓扑 5.2…

Maven依赖解决

记一次Maven依赖冲突解决 以zookeeper为例 一、问题描述 当下载zookeeper的2.2.6.RELEASE时,报错 Could not find artifact org.springframework.cloud:spring-cloud-starter-zookeeper-discovery:pom:2.2.6.RELEASE in central (https://repo.maven.apache.org/ma…

3D包容盒子

原理简述 包围体(包容盒)是一个简单的几何空间,里面包含着复杂形状的物体。为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理)。包…

Flutter中的StreamBuilder和FutureBuilder有什么区别

流行的跨平台框架 Flutter 为开发人员提供了两个强大的小部件来处理异步操作:StreamBuilder 和 FutureBuilder。尽管它们有相似之处,但了解它们的不同之处,以便为您的特定用例选择合适的一个是至关重要的。在这篇博文中,我们将深入…

matlab相机标定实验

实验原理 1. 相机标定坐标系 相机的参数对目标的识别、定位精度有很大的影响,相机标定就是为了求出相机的内外参数。标定中有3个不同层次的坐标系:世界坐标系、相机坐标系和图像坐标系(图像物理坐标系和图像像素坐标系)。世界坐…

HTML-注册页面

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> </head> <body><from action"#" method"get"><table border"1" align&q…

智能井盖传感器:提升城市安全与便利的利器

在智能化城市建设的浪潮中&#xff0c;WITBEE万宾智能井盖传感器&#xff0c;正以其卓越的性能和创新的科技&#xff0c;吸引着越来越多的关注。本文小编将为大家详细介绍这款产品的独特优势和广阔应用前景。 在我们生活的城市中&#xff0c;井盖可能是一个最不起眼的存在。然而…

代码随想录算法训练营第六十天 | 单调栈 part 1 | 739. 每日温度、496.下一个更大元素 I

目录 739. 每日温度思路代码 496.下一个更大元素 I思路代码 739. 每日温度 Leetcode 思路 维持一个单调递增的栈&#xff0c;向栈逐一pushtemperatures里的index。 如果当前遍历的元素大于栈顶元素&#xff0c;这意味着 栈顶元素的 右边的最大的元素就是 当前遍历的元素&…

基于安卓android微信小程序的旅游系统

项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…

PG学习笔记(PostgreSQL)

PG学习笔记&#xff08;PostgreSQL&#xff09; 1、PG特点 项目极限值最大单个数据库大小不限最大最大数据单表大小32 TB单条记录最大1.6TB单字段最大允许1GB单表允许最大记录数不限单表最大字段数250~1600&#xff08;取决于字段类型&#xff09;单表最大索引数不限 2、PG安…

在 Amazon SageMaker 上使用 ESMFold 语言模型加速蛋白质结构预测

蛋白质驱动着许多生物过程&#xff0c;如酶活性、分子输运和细胞支持。通过蛋白质的三维结构&#xff0c;可以深入了解蛋白质的功能以及蛋白质如何与其他生物分子相互作用。测定蛋白质结构的实验方法&#xff08;如 X 射线晶体学和核磁共振波谱学&#xff09;既昂贵又耗时。相比…

深度学习DAY3:FFNNLM前馈神经网络语言模型

1 神经网络语言模型NNLM的提出 文章&#xff1a;自然语言处理中的语言模型预训练方法&#xff08;ELMo、GPT和BERT&#xff09; https://www.cnblogs.com/robert-dlut/p/9824346.html 语言模型不需要人工标注语料&#xff08;属于自监督模型&#xff09;&#xff0c;所以语言…

VRRP 虚拟路由器冗余协议的解析和配置

VRRP的解析 个人简介 原理和HSRP的差不多&#xff0c;少了一些状态就只有了三种状态 还有不同的就是VRRP严格按照抢占要求 一个VRRP组中具有最高优先级的设备成为Master路由器缺省优先级为100若优先级相同&#xff0c;具有最高接口IP地址最大的路由器成为Master路由器抢占(Pr…

uniapp 首页制作

uniapp拨打固定的电话 function Hotline() {// 拨打电话uni.makePhoneCall({phoneNumber: 19969547693})}页面跳转 //普通跳转function homepage() {uni.navigateTo({url: /pages/homepage/homepage});}//二、uni.redirectTo关闭当前页面&#xff0c;跳转到应用内的某个页面。…

Qt源码调试

在实际Qt开发中如果遇到Qt内部的问题&#xff0c;往往只能通过调试源代码解决。可是从Qt5.9.9版本开始安装包中就不提供pdb文件。我安装的Qt5.12.12版本目录路径D:\Qt\Qt5.12.12\5.12.12\msvc2017_64\bin下面并没有dll配套的pdb文件。但是如果自己编译源码又太费时间。 今天在观…

踩雷react-useRef钩子函数

今天测试提了一个bug&#xff0c;之前做的有个需求&#xff0c;在触发事件发起请求后&#xff0c;成功响应返回的新的数据没有第一时间渲染到网页上。 方法也都成功更新了数据&#xff0c;就是渲染会慢1-2分钟&#xff0c;排错排了老半天&#xff0c;最后找到了原因。 一般情…

CentOS 安装MySQL 详细教程

参考:https://www.cnblogs.com/dotnetcrazy/p/10871352.html 参考:https://www.cnblogs.com/qiujz/p/13390811.html 参考:https://blog.csdn.net/darry1990/article/details/130419433 一、安装 一、进入安装目录 将账户切换到root账户下&#xff0c;进入local目录下 cd /usr…

mysql面试题42:主键使用自增ID还是UUID,并且说下原因

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 其他的分布式主键使用方案,可以看下这篇文章:《有哪些合适的分布式主键方案》 面试官:主键使用自增ID还是UUID,并且说下原因 自增ID 自增ID(Auto I…

免费主机|永久免费空间|php虚拟主机|博客主机|论坛主机|免费域名|云主机

免费主机|永久免费空间|php虚拟主机|博客主机|论坛主机|免费域名|云主机 在出教程之前准备好久&#xff0c;测试搭建轻量论坛无压力 选用稳定免费域名➕免费主机分销给&#xff0c;可以套CDN使用 坚持免费时间是大厂不能媲美&#xff0c;刚开始做网站时用的是这个分销&#…

分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-GRU开普勒算法优化卷积门控循环单…