spring boot date返回时间格式化,springboot配置时间格式
00-1010格式全局时间字段1。前端时间格式(不要做没心没肺的人)2。SimpleDateFormat格式(不推荐)3。DateTimeFormatter格式(不推荐)4。全球时间格式实现原理分析(推荐)5。部分时间格式(推荐)总结突发事件。就是这样。
00-1010在yml中添加以下配置:
spring . Jackson . date-format=yyyy-mm-ddhh 3360mm 3360 ss或
Spring 3360Jackson 3360 # #的格式是YYY-MM-DD HH3360 mm : ss日期格式3360 YYY-MM-DD HH3360 mm : ss # #计时区,解决了8小时的时差问题。时区: GMT 8OK,你的后端全部统一,应急的同志可以这么做。以下延伸知识不需要学,想学可以先收藏(建议不要收藏,收藏了也不看,或者一口气看完赞,不收藏也自欺欺人)
系统知识
00-1010前端工程时间格式化方法,实现代码如下。
//JS版本时间格式函数日期格式(FMT,日期){ let retConstopt={y 3360date。GetFullyYear()。Tostring(),//year m 3360(日期。GetMonth () 1)。Tostring(),//month d 3360date。GetDate()。Tostring //day h 3360date。gethours()。tostring(),//hour m 3360date。getminutes()。tostring(),//分钟3360日期。getseconds()。tostring ()//。for(让k在opt中){ ret=new RegExp(( k ))。exec(fmt);if (ret) { fmt=fmt.replace(ret[1],(ret[1])。长度==1)?(opt[k]) : (opt[k])。padStart(ret[1])。长度, 0 )))};};返回fmt}方法调用:
let Date=new Date();date format( YYYY-mm-DD hh :mm : ss ,日期);但是我们能对前端小姐姐这么残忍吗?像下面这个前端小姐姐那么可爱,你能忍吗?
不,不能,坚决在后端改!
00-1010使用SimpleDateFormat进行时间格式化,这也是JDK 8之前重要的时间格式化方法。其核心实现代码如下:
//定义时间格式对象和格式样式simple date format date format=new simple date format( yyyy-mm-ddhh 3360mm 3360 ss );//Format time对象string date=date Format . Format(new date())接下来我们用SimpleDateFormat来实现这个项目中的时间格式化。其实现代码如下:
@ request mapping(/list )publicllistusergetlist(){//定义时间格式对象simpledateformat date format=new simpledateformat( yyyy-mm-ddhh 3360mm 3360 ss );list user list=user mapper . getlist();//循环执行时间格式list.forEach(item-{//使用保留字段ctime接收由createtime (Date-String)格式化的时间
item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); return list;}但是这样会产生新的问题,为什么接口的返回字段咋变了呢,之前的字段是 createtime 现在却是 ctime。
这是因为使用 SimpleDateFormat.format 方法之后,它返回的是一个 String 类型的结果,而我们之前的 createtime 和 updatetime 字段都是 Date 类型的,因此它们是不能接收时间格式化得结果的。
3.DateTimeFormatter格式化(不推荐)
JDK 8 之后,我们可以使用 DateTimeFormatter 来替代 SimpleDateFormat,因为 SimpleDateFormat 是非线程安全的,而 DateTimeFormatter 是线程安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 来进行时间格式化。
DateTimeFormatter 格式化的代码和 SimpleDateFormat 类似,具体实现如下:
@RequestMapping("/list")public List<User> getList() { // 定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List<User> list = userMapper.getList(); // 循环执行时间格式化 list.forEach(item -> { // 使用预留字段 ctime 接收 createtime 格式化的时间(Date->String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); return list;}
DateTimeFormatter 和 SimpleDateFormat 在使用上的区别是 DateTimeFormatter 是用来格式化 JDK 8 提供的时间类型的,如 LocalDateTime,而 SimpleDateFormat 是用来格式化 Date 类型的,所以我们需要对 Userer 实体类做如下的修改:
import com.fasterxml.jackson.annotation.JsonIgnore;import lombok.Data;import java.time.LocalDateTime;@Datapublic class User { private int id; private String username; @JsonIgnore private LocalDateTime createtime; private String ctime; @JsonIgnore private LocalDateTime updatetime; private String utime;}
我们可以使用 LocalDateTime 来接收 MySQL 中的 datetime 类型。
4.全局时间格式化(推荐)
以上两种后端格式化的实现都有一个致命的缺点,它们在进行时间格式化的时候,都需要对核心业务类做一定的修改,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢?
答案是:有的。我们可以不改任何代码,只需要在配置文件中设置一下就可以实现时间格式化的功能了。
首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:
格式化全局时间字段
在yml中添加如下配置:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
指定时间区域类型在yml中添加:
spring.jackson.time-zone=GMT+8
或者下面的格式
spring: jackson: ## 格式为yyyy-MM-dd HH:mm:ss date-format: yyyy-MM-dd HH:mm:ss ## 定时区,解决8小时的时间差问题 time-zone: GMT+8
这样设置之后,我们将原始的 User 和 UserController 进行还原。
User 实现代码如下:
import lombok.Data;import java.util.Date;@Datapublic class User { private int id; private String username; private Date createtime; private Date updatetime;}
UserController 实现代码:
@RequestMapping("/list")public List<User> getList() { return userMapper.getList();}
然后我们运行程序,看到的执行结果如下:
从以上结果和代码可以看出,我们只需要在程序中简单配置一下,就可以实现所有时间字段的格式化了。
实现原理分析
为什么在配置文件中设置一下,就可以实现所有时间字段的格式化了呢?
# 格式化全局时间字段spring.jackson.date-format=yyyy-MM-dd HH:mm:ss# 指定时间区域类型spring.jackson.time-zone=GMT+8
这是因为 Controller 在返回数据时,会自动调用 Spring Boot 框架中内置的 JSON 框架 Jackson,对返回的数据进行统一的 JSON 格式化处理,在处理的过程中它会判断配置文件中是否设置了spring.jackson.date-format=yyyy-MM-dd HH:mm:ss,如果设置了,那么 Jackson 框架在对时间类型的字段输出时就会执行时间格式化的处理,这样我们就通过配置来实现全局时间字段的格式化功能了。
为什么要指定时间区域类型spring.jackson.time-zone=GMT+8呢?
最现实的原因是,如果我们不指定时间区域类型,那么查询出来的时间就会比预期的时间少 8 个小时,这因为我们(中国)所处的时间区域比世界时间少 8 个小时导致的,而当我们设置了时区之后,我们的时间查询才会和预期时间保持一致。
GMT 是什么?时间区域设置中的GMT 是什么意思?
Greenwich Mean Time (GMT) 格林尼治时间,也叫做世界时间。
(下面是格林尼治时间的百度百科,想了解的可以看一下,不想了解的知道是世界时间就行,其他的就是的臀部——规定)
格林尼治时间:格林尼治是英国伦敦南郊原皇家格林尼治天文台所在地,地球本初子午线的标界处,世界计算时间和经度的起点。以其海事历史、作为本初子午线的标准点、以及格林尼治时间以其命名而闻名于世。这里地势险要,风景秀丽,兼具历史和地方风情,也是伦敦在泰晤士河的东方门户。
不光是天文学家使用格林尼治时间,就是在新闻报刊上也经常出现这个名词。我们知道各地都有各地的地方时间。如果对国际上某一重大事情,用地方时间来记录,就会感到复杂不便.而且将来日子一长容易搞错。因此,天文学家就提出一个大家都能接受且又方便的记录方法,那就是以格林尼治的地方时间为标准。
以本初子午线的平子夜起算的平太阳时。又称格林尼治平时或格林尼治时间。各地的地方平时与世界时之差等于该地的地理经度。1960年以前曾作为基本时间计量系统被广泛应用。由于地球自转速率曾被认为是均匀的,因此在1960年以前,世界时被认为是一种均匀时。由于地球自转速度变化的影响,它不是一种均匀的时间系统,它与原子时或力学时都没有任何理论上的关系,只有通过观测才能对它们进行比较。后来世界时先后被历书时和原子时所取代,但在日常生活、天文导航、大地测量和宇宙飞行等方面仍属必需;同时,世界时反映地球自转速率的变化,是地球自转参数之一,仍为天文学和地球物理学的基本资料。
5.部分时间格式化(推荐)
某些场景下,我们不需要对全局的时间都进行统一的处理,这种情况我们可以使用注解的方式来实现部分时间字段的格式化。
例如需要在实体类 User 中添加 @JsonFormat 注解,这样就可以实现时间的格式化功能了,实现代码如下:
import com.fasterxml.jackson.annotation.JsonFormat;import lombok.Data;import java.util.Date;@Datapublic class User { private int id; private String username; // 对 createtime 字段进行格式化处理 @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8") private Date createtime; private Date updatetime;}
修改完代码之后,我们运行项目就可以显示格式化后的时间了
总结
Spring Boot 的项目,推荐使用第 4 种全局时间格式化或第 5 种局部时间格式化的方式,这两种实现方式都无需修改核心业务代码,只需要简单的配置一下,就可以完成时间的格式化功能了。
到此这篇关于Springboot配置返回日期格式化五种方法详解的文章就介绍到这了,更多相关Springboot 返回日期格式化内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。