刚来这家公司的时候, 发现很多同事还在用这种方式写代码

当时以为是偶然, 刚才在群里发现还有好多人在交流应当加哪些注解, 声明时区问题.

当写一个东西感到麻烦的时候, 那么大概率是有低成本的更优解的

分以下两种情况来处理

请求体

使用Jackson, 仅保留时间相关配置

package kim.nzxy.ly.common.config;

import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter; /**
* JSON相关
*
* @author ly-chn
*/
@Configuration
public class JacksonConfig {
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return builder -> {
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(dtf))
.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(dtf))
// 以下代码"可以, 但没必要"
.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME))
.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME))
.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE))
.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE))
};
}
}

请求行

用于query string / request parameter

package kim.nzxy.ly.common.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.time.format.DateTimeFormatter; /**
* request parameter date time format
* @author ly-chn
*/
@Configuration
public class DateTimeFormatConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar();
registrar.setDateTimeFormatter(dateTimeFormatter);
// 以下代码"可以, 但没必要"
registrar.setDateFormatter(DateTimeFormatter.ISO_LOCAL_DATE);
registrar.setTimeFormatter(DateTimeFormatter.ISO_LOCAL_TIME);
registrar.registerFormatters(registry);
}
}

yml方式配置, 任选其一即可

spring:
mvc:
format:
date-time: yyyy-MM-dd HH:mm:ss
# 以下代码"可以, 但没必要"
date: yyyy-MM-dd
time: HH:mm:ss

使用示例

实体类

package kim.nzxy.ly.test.entity;

import lombok.Data;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime; @Data
public class Temp {
private LocalDateTime ldt;
private LocalDate ld;
private LocalTime lt;
}

controller中接收

package kim.nzxy.ly.controller;

import kim.nzxy.ly.modules.system.entity.Temp;
import org.springframework.web.bind.annotation.*; import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime; @RestController
@RequestMapping("temp")
public class TempController {
@GetMapping("1")
public Temp test1(LocalDateTime ldt, LocalDate ld, LocalTime lt) {
return new Temp(ldt, ld, lt);
} @GetMapping("2")
public Temp test2(Temp temp) {
return temp;
} @PostMapping("3")
public Temp test3(@RequestBody Temp temp) {
return temp;
}
}

test.rest

### 逐个传输
GET http://localhost:8937/temp/1?ldt=2006-01-02 15:04:05&ld=2006-01-02&lt=15:04 ### 实体类接收
GET http://localhost:8937/temp/2?ldt=2006-01-02 15:04:05&ld=2006-01-02&lt=15:04 ### json请求体
POST http://localhost:8937/temp/3
Content-Type: application/json {
"ldt": "2006-01-02 15:04:05",
"ld": "2006-01-02",
"lt": "15:04"
}

总结

  1. LocalTime和LocalDate的格式一般不用配置, 默认都是常用格式

  2. DateTimeFormatter.ISO_LOCAL_TIME和DateTimeFormatter.ofPattern(String pattern)区别

    这个可以查看其源码, ISO_LOCAL_TIME是可以解析"03:04" / "03:04:05" / "03:04:05.111222333"(时分, 时分秒, 时分秒+毫秒)这些格式的, 如果直接使用ofPattern则不行

  3. Date类型怎么处理

    首先不建议使用Date类型, 如果有需要, 尽量改成Local*, 除非后端只接受同一种日期格式:

    1. yml配置参考上方yml方式配置

    2. 请求行配置尝试新建配置类, 继承WebBindingInitializer, 然后registerCustomEditor

    3. Jackson yml

      jackson:
      date-format: yyyy-MM-dd HH:mm:ss
      # Asia/Shanghai(CST)
      time-zone: GMT+8

看到项目中的DateTimeFormat和JsonFormat就头大的更多相关文章

  1. 项目中整合第三方插件与SpringMVC数据格式化关于ip地址

    一.Bootstrap 响应式按钮 <div calss="col-sm-2"> <button class="btn btn-default btn- ...

  2. Spring Boot项目中使用 TrueLicense 生成和验证License(服务器许可)

    一 简介 License,即版权许可证,一般用于收费软件给付费用户提供的访问许可证明.根据应用部署位置的不同,一般可以分为以下两种情况讨论: 应用部署在开发者自己的云服务器上.这种情况下用户通过账号登 ...

  3. 从项目中理解SSM框架

    我们看招聘信息的时候,经常会看到这一点,需要具备SSH框架的技能:而且在大部分教学课堂中,也会把SSH作为最核心的教学内容. 但是,我们在实际应用中发现,SpringMVC可以完全替代Struts,配 ...

  4. LocalDateTime在项目中的使用(LocalDateTime对接前端通过时间戳互转、LocalDateTime对接数据库)

    目录 1. 博客编写背景 2. LocalDateTime 前端交互 2.1 LocalDateTime 向前端写入时间戳 2.1.1 fastJson 默认的写入格式 2.1.2 更改 fastJs ...

  5. VS项目中使用Nuget还原包后编译生产还一直报错?

    Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...

  6. ABP项目中使用Swagger生成动态WebAPI

    本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...

  7. iOS 之项目中遇到的问题总结

    昨天去一家公司面试,面试官问了我在项目开发中遇到过哪些问题,是什么引起的,怎样解决的? 当时由于有点小紧张只说出了一两点,现在就来好好总结一下. 问题: 1.两表联动 所谓的两表联动就是有左右两个表格 ...

  8. My97DatePicker时间控件在项目中的应用

    一.下载My97DatePicker的压缩包My97DatePicker.rar,解压. 注:My97DatePicker最新版本有开发包,项目中使用时删掉,以便节省空间,提高程序的运行效率. 二.在 ...

  9. 在项目中同时使用Objective-C和Swift

    苹果发布的Swift语言可以和之前的Objective-C语言同时存在于一个项目中. 可能有人会认为是同一个类文件中既可以有Objective-C也可以有Swift,这是不对的.同一个类文件或同一个代 ...

  10. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

随机推荐

  1. Nginx基础02:配置文件nginx.conf(Part1)

    我们使用Nginx主要是通过其配置文件nginx.conf来实现的.按照一定的规则,编写特定的指令,可以帮助我们实现对Web服务的控制!所以,学习Nginx的用法,几乎就是学习nginx.conf! ...

  2. 精华推荐 |【算法数据结构专题】「延时队列算法」史上非常详细分析和介绍如何通过时间轮(TimingWheel)实现延时队列的原理指南

    时间轮的介绍 时间轮(TimeWheel)是一种实现延迟功能(定时器)的精妙的高级算法,其算法应用范围非常广泛,在Java开发过程中常用的Dubbo.Netty.Akka.Quartz.ZooKeep ...

  3. mongodump导出mongodb中的数据

    如果数据量小,用navicat或者其它客户端可以很方便的导出数据,但如果数据量比较大的话,建议用mongo官方工具 mongodump 下载地址: https://www.mongodb.com/tr ...

  4. 报错com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1' for column 'date' at row 1问题解决

    出现 com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1' ...

  5. 微信APP支付后台配置

    1.申请商户号 ,申请成功后去配置证书APIv2 https://pay.weixin.qq.com/index.php/core/cert/api_cert#/    --MchKey  和MchI ...

  6. NSIS Inetc插件 扩展使用

    Inetc客户端插件,用于文件的上传和下载. 官网文档:https://nsis.sourceforge.io/Inetc_plug-in 以下载net包为例 inetc::get "htt ...

  7. java--BigDecimal 类型介绍

    BigDecimal.add();       //加法 BigDecimal.subtract(); //减法 BigDecimal.multiply(); //乘法 BigDecimal.divi ...

  8. C++ STL中的二分法

    二分法介绍 狭义的二分法是一种在有序的数组中查找是否存在某个值的算法.广义的二分法不一定需要显式的数组,只需要有序的解空间即可.(此处解空间借用线性代数的称谓,仅表示所有合法解的集合,与线性代数无关) ...

  9. 使用windows平板学习与办公的一些经历(酷比魔方i9篇)

    大概是在2019年的时候,我在某平台上购买了900元的二手windows平板电脑,酷比魔方i9 首先谈谈背景.当时我手里是有个笔记本,屏幕大概15.6寸,4G+256G的,平时用的时候功率平均20几W ...

  10. java中overload与override的区别

    1.综述 重写(Override)也称覆盖,它是父类与子类之间多态性的一种表现,而重载(Overload)是一个类中多态性的一种表现. override从字面就可以知道,它是覆盖了一个方法并且对其重写 ...