在我们的日常工作中,时间格式化是很常见的事情,所以这篇文章我们就盘点一下springBoot中时间格式化的几种方法。
为了演示方便,我写了一个简单的SpringBoot项目,其中数据库包含一个userinfo表。其组成结构及数据信息如下:
项目目录是这样的: UserController实现代码如下: @RestController@RequestMapping("/用户")公共类用户控制器 { @Resource 私有 UserMapper userMapper; @RequestMapping ("/列表") 公共列表getList(){ return userMapper.getList(); }} UserMapper实现代码如下:@Mapper公共 接口 UserMapper { 公共列表 getList();} UserInfo实现代码如下: { 私人intid; 私有 字符串用户名; 私有创建时间; 私人日期更新时间;} UserMapper.xml实现代码如下: "1.0" 编码="UTF-8"?>”-// Mybatis.org//DTD Mapper 3.0//EN" "http://www.sychzs.cn/dtd/mybatis-3-mapper.dtd"> <映射器命名空间="com.example.demo.mapper.UserMapper"> <选择id="getList" resultType="com .example.demo.model.UserInfo ">从用户信息中选择*写完上面的内容,我们就创建了一个简单的Spring Boot项目。接下来我们使用PostMan来模拟调用UserController接口。执行结果如下: 从上面的结果可以看出,时间字段createtime和updatetime的显示方式非常“乱”,不符合我们的阅读习惯,无法直接显示给前端的用户来说,这个时候,我们需要对时间进行格式化。 时间格式一共有5种方法: 1.前端时间格式 如果后端在公司有绝对的话语权,或者后端实力比较强,我们可以把时间格式化的“锅”强行交给前端来处理。 为了让这个“锅”变得更顺畅(如果雷哥不成为厨师就太可惜了),我们可以为前端工程师提供实用的时间格式化方法。实现代码如下。 JS版本时间格式化函数 日期格式(fmt,日期){ 让 ret; const opt = { "Y+": date.getFullYear().toString(), //年份 “m+”:(日期。 getMonth () + 1).toString(), //月 "d+": date.getDate().toString(), //日 "H+": date.getHours().toString(), //当 "M+": 日期.get 分钟().toString() , // 分钟 "S+": date.getSeconds().toString() // 秒 //如果有其他格式字符需求,可以继续添加。 ,必须转换为字符串 }; for (let k in 选择){ ret = 新 RegExp("(" + k + ")") .exec (fmt); if ( ret ) { fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart( ret [1].长度,"0"))) }; }; 返回 fmt;}方法调用: 让日期=新日期();日期格式() “YYYY-mm-dd HH:MM:SS”,日期);>>> 2021-07-25 21:45:12 2.SimpleDateFormat格式化 大多数情况下,我们还是需要自力更生,自理烦恼。这个时候我们后端程序员就需要发挥自己的优势了。我们提供的第一种格式化方法是使用SimpleDateFormat用于时间格式化。也是JDK 8之前的一种重要的时间格式化方法,其核心实现代码如下: ? ); // 格式化时间对象 String date = dateFormat.format(new Date()) 接下来我们使用SimpleDateFormat来实现本项目中的时间格式化。其实现代码如下:@RequestMapping("/列表")公共列表 getList(){ // 定义时间格式对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); 列表 list = userMapper.getList(); //循环执行时格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式的时间(日期->字符串) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 程序执行结果如下: 从上面的结果可以看出,时间格式没有问题,也正是我们所期望的。但细心的读者会发现,为什么接口的返回字段发生了变化呢? (之前的字段是createtime,但现在是ctime...)这是因为使用#SimpleDateFormat.format方法后,返回的是一个String类型的结果,而我们之前的创建时间 和 更新时间字段均为日期类型,因此无法接收时间格式化的结果。 所以这时候我们需要在实体类UserInfo中添加两个字符串类型的“时间”字段,然后隐藏之前的Data类型的时间字段,并且最后实体类UserInfo的实现代码如下: 导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入 java.www.sychzs.cn; @DatapublicclassUserInfo{私人intid; private String username; @JsonIgnore //输出结果时隐藏该字段 私人 日期创建时间; // 时间格式字段 private String ctime; @JsonIgnore //输出结果时隐藏该字段 private date UpdateTime;//时间格式格式字段private字符串utime;}} 我们可以使用@JsonIgnore注释来隐藏字段。隐藏后执行结果如下: 3.DateTimeFormatter 格式化 JDK 8之后,我们可以使用DateTimeFormatter来替代SimpleDateFormat,因为SimpleD ate Format 不是线程安全的,而 DateTimeFormatter 是线程安全的 是安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 进行时间格式化。 DateTimeFormatter 格式化代码类似于SimpleDateFormat。具体实现如下:@RequestMapping("/列表")公共列表 getList(){ //定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List 列表= userMapper .getList(); //循环执行时间格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式化时间(Date - >String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 执行结果如下: DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;} 我们可以使用LocalDateTime来接收MySQL中的datetime 类型。 4.全局时间重置 以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢? 答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。 首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 设置完成后,我们将恢复原来的UserInfo和UserController。 UserInfo实现代码如下: 导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;} UserController实现代码: @RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();} 然后我们运行程序,看到如下执行结果: 从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
项目目录是这样的:
UserController实现代码如下: @RestController@RequestMapping("/用户")公共类用户控制器 { @Resource 私有 UserMapper userMapper; @RequestMapping ("/列表") 公共列表getList(){ return userMapper.getList(); }} UserMapper实现代码如下:@Mapper公共 接口 UserMapper { 公共列表 getList();} UserInfo实现代码如下: { 私人intid; 私有 字符串用户名; 私有创建时间; 私人日期更新时间;} UserMapper.xml实现代码如下: "1.0" 编码="UTF-8"?>”-// Mybatis.org//DTD Mapper 3.0//EN" "http://www.sychzs.cn/dtd/mybatis-3-mapper.dtd"> <映射器命名空间="com.example.demo.mapper.UserMapper"> <选择id="getList" resultType="com .example.demo.model.UserInfo ">从用户信息中选择*写完上面的内容,我们就创建了一个简单的Spring Boot项目。接下来我们使用PostMan来模拟调用UserController接口。执行结果如下: 从上面的结果可以看出,时间字段createtime和updatetime的显示方式非常“乱”,不符合我们的阅读习惯,无法直接显示给前端的用户来说,这个时候,我们需要对时间进行格式化。 时间格式一共有5种方法: 1.前端时间格式 如果后端在公司有绝对的话语权,或者后端实力比较强,我们可以把时间格式化的“锅”强行交给前端来处理。 为了让这个“锅”变得更顺畅(如果雷哥不成为厨师就太可惜了),我们可以为前端工程师提供实用的时间格式化方法。实现代码如下。 JS版本时间格式化函数 日期格式(fmt,日期){ 让 ret; const opt = { "Y+": date.getFullYear().toString(), //年份 “m+”:(日期。 getMonth () + 1).toString(), //月 "d+": date.getDate().toString(), //日 "H+": date.getHours().toString(), //当 "M+": 日期.get 分钟().toString() , // 分钟 "S+": date.getSeconds().toString() // 秒 //如果有其他格式字符需求,可以继续添加。 ,必须转换为字符串 }; for (let k in 选择){ ret = 新 RegExp("(" + k + ")") .exec (fmt); if ( ret ) { fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart( ret [1].长度,"0"))) }; }; 返回 fmt;}方法调用: 让日期=新日期();日期格式() “YYYY-mm-dd HH:MM:SS”,日期);>>> 2021-07-25 21:45:12 2.SimpleDateFormat格式化 大多数情况下,我们还是需要自力更生,自理烦恼。这个时候我们后端程序员就需要发挥自己的优势了。我们提供的第一种格式化方法是使用SimpleDateFormat用于时间格式化。也是JDK 8之前的一种重要的时间格式化方法,其核心实现代码如下: ? ); // 格式化时间对象 String date = dateFormat.format(new Date()) 接下来我们使用SimpleDateFormat来实现本项目中的时间格式化。其实现代码如下:@RequestMapping("/列表")公共列表 getList(){ // 定义时间格式对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); 列表 list = userMapper.getList(); //循环执行时格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式的时间(日期->字符串) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 程序执行结果如下: 从上面的结果可以看出,时间格式没有问题,也正是我们所期望的。但细心的读者会发现,为什么接口的返回字段发生了变化呢? (之前的字段是createtime,但现在是ctime...)这是因为使用#SimpleDateFormat.format方法后,返回的是一个String类型的结果,而我们之前的创建时间 和 更新时间字段均为日期类型,因此无法接收时间格式化的结果。 所以这时候我们需要在实体类UserInfo中添加两个字符串类型的“时间”字段,然后隐藏之前的Data类型的时间字段,并且最后实体类UserInfo的实现代码如下: 导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入 java.www.sychzs.cn; @DatapublicclassUserInfo{私人intid; private String username; @JsonIgnore //输出结果时隐藏该字段 私人 日期创建时间; // 时间格式字段 private String ctime; @JsonIgnore //输出结果时隐藏该字段 private date UpdateTime;//时间格式格式字段private字符串utime;}} 我们可以使用@JsonIgnore注释来隐藏字段。隐藏后执行结果如下: 3.DateTimeFormatter 格式化 JDK 8之后,我们可以使用DateTimeFormatter来替代SimpleDateFormat,因为SimpleD ate Format 不是线程安全的,而 DateTimeFormatter 是线程安全的 是安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 进行时间格式化。 DateTimeFormatter 格式化代码类似于SimpleDateFormat。具体实现如下:@RequestMapping("/列表")公共列表 getList(){ //定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List 列表= userMapper .getList(); //循环执行时间格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式化时间(Date - >String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 执行结果如下: DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;} 我们可以使用LocalDateTime来接收MySQL中的datetime 类型。 4.全局时间重置 以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢? 答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。 首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 设置完成后,我们将恢复原来的UserInfo和UserController。 UserInfo实现代码如下: 导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;} UserController实现代码: @RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();} 然后我们运行程序,看到如下执行结果: 从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
UserController实现代码如下:
@RestController@RequestMapping("/用户")公共类用户控制器 { @Resource 私有 UserMapper userMapper; @RequestMapping ("/列表") 公共列表getList(){ return userMapper.getList(); }}
UserMapper实现代码如下:
@Mapper公共 接口 UserMapper { 公共列表 getList();}
UserInfo实现代码如下:
UserMapper.xml实现代码如下:
"1.0" 编码="UTF-8"?>”-// Mybatis.org//DTD Mapper 3.0//EN" "http://www.sychzs.cn/dtd/mybatis-3-mapper.dtd"> <映射器命名空间="com.example.demo.mapper.UserMapper"> <选择id="getList" resultType="com .example.demo.model.UserInfo ">从用户信息中选择*
写完上面的内容,我们就创建了一个简单的Spring Boot项目。接下来我们使用PostMan来模拟调用UserController接口。执行结果如下:
从上面的结果可以看出,时间字段createtime和updatetime的显示方式非常“乱”,不符合我们的阅读习惯,无法直接显示给前端的用户来说,这个时候,我们需要对时间进行格式化。 时间格式一共有5种方法: 1.前端时间格式 如果后端在公司有绝对的话语权,或者后端实力比较强,我们可以把时间格式化的“锅”强行交给前端来处理。 为了让这个“锅”变得更顺畅(如果雷哥不成为厨师就太可惜了),我们可以为前端工程师提供实用的时间格式化方法。实现代码如下。 JS版本时间格式化函数 日期格式(fmt,日期){ 让 ret; const opt = { "Y+": date.getFullYear().toString(), //年份 “m+”:(日期。 getMonth () + 1).toString(), //月 "d+": date.getDate().toString(), //日 "H+": date.getHours().toString(), //当 "M+": 日期.get 分钟().toString() , // 分钟 "S+": date.getSeconds().toString() // 秒 //如果有其他格式字符需求,可以继续添加。 ,必须转换为字符串 }; for (let k in 选择){ ret = 新 RegExp("(" + k + ")") .exec (fmt); if ( ret ) { fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart( ret [1].长度,"0"))) }; }; 返回 fmt;}方法调用: 让日期=新日期();日期格式() “YYYY-mm-dd HH:MM:SS”,日期);>>> 2021-07-25 21:45:12 2.SimpleDateFormat格式化 大多数情况下,我们还是需要自力更生,自理烦恼。这个时候我们后端程序员就需要发挥自己的优势了。我们提供的第一种格式化方法是使用SimpleDateFormat用于时间格式化。也是JDK 8之前的一种重要的时间格式化方法,其核心实现代码如下: ? ); // 格式化时间对象 String date = dateFormat.format(new Date()) 接下来我们使用SimpleDateFormat来实现本项目中的时间格式化。其实现代码如下:@RequestMapping("/列表")公共列表 getList(){ // 定义时间格式对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); 列表 list = userMapper.getList(); //循环执行时格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式的时间(日期->字符串) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 程序执行结果如下: 从上面的结果可以看出,时间格式没有问题,也正是我们所期望的。但细心的读者会发现,为什么接口的返回字段发生了变化呢? (之前的字段是createtime,但现在是ctime...)这是因为使用#SimpleDateFormat.format方法后,返回的是一个String类型的结果,而我们之前的创建时间 和 更新时间字段均为日期类型,因此无法接收时间格式化的结果。 所以这时候我们需要在实体类UserInfo中添加两个字符串类型的“时间”字段,然后隐藏之前的Data类型的时间字段,并且最后实体类UserInfo的实现代码如下: 导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入 java.www.sychzs.cn; @DatapublicclassUserInfo{私人intid; private String username; @JsonIgnore //输出结果时隐藏该字段 私人 日期创建时间; // 时间格式字段 private String ctime; @JsonIgnore //输出结果时隐藏该字段 private date UpdateTime;//时间格式格式字段private字符串utime;}} 我们可以使用@JsonIgnore注释来隐藏字段。隐藏后执行结果如下: 3.DateTimeFormatter 格式化 JDK 8之后,我们可以使用DateTimeFormatter来替代SimpleDateFormat,因为SimpleD ate Format 不是线程安全的,而 DateTimeFormatter 是线程安全的 是安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 进行时间格式化。 DateTimeFormatter 格式化代码类似于SimpleDateFormat。具体实现如下:@RequestMapping("/列表")公共列表 getList(){ //定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List 列表= userMapper .getList(); //循环执行时间格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式化时间(Date - >String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 执行结果如下: DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;} 我们可以使用LocalDateTime来接收MySQL中的datetime 类型。 4.全局时间重置 以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢? 答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。 首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 设置完成后,我们将恢复原来的UserInfo和UserController。 UserInfo实现代码如下: 导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;} UserController实现代码: @RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();} 然后我们运行程序,看到如下执行结果: 从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
从上面的结果可以看出,时间字段createtime和updatetime的显示方式非常“乱”,不符合我们的阅读习惯,无法直接显示给前端的用户来说,这个时候,我们需要对时间进行格式化。
createtime
updatetime
时间格式一共有5种方法:
如果后端在公司有绝对的话语权,或者后端实力比较强,我们可以把时间格式化的“锅”强行交给前端来处理。
为了让这个“锅”变得更顺畅(如果雷哥不成为厨师就太可惜了),我们可以为前端工程师提供实用的时间格式化方法。实现代码如下。
函数 日期格式(fmt,日期){ 让 ret; const opt = { "Y+": date.getFullYear().toString(), //年份 “m+”:(日期。 getMonth () + 1).toString(), //月 "d+": date.getDate().toString(), //日 "H+": date.getHours().toString(), //当 "M+": 日期.get 分钟().toString() , // 分钟 "S+": date.getSeconds().toString() // 秒 //如果有其他格式字符需求,可以继续添加。 ,必须转换为字符串 }; for (let k in 选择){ ret = 新 RegExp("(" + k + ")") .exec (fmt); if ( ret ) { fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart( ret [1].长度,"0"))) }; }; 返回 fmt;}
方法调用:
让日期=新日期();日期格式() “YYYY-mm-dd HH:MM:SS”,日期);>>> 2021-07-25 21:45:12
大多数情况下,我们还是需要自力更生,自理烦恼。这个时候我们后端程序员就需要发挥自己的优势了。我们提供的第一种格式化方法是使用SimpleDateFormat用于时间格式化。也是JDK 8之前的一种重要的时间格式化方法,其核心实现代码如下:
SimpleDateFormat
接下来我们使用SimpleDateFormat来实现本项目中的时间格式化。其实现代码如下:
@RequestMapping("/列表")公共列表 getList(){ // 定义时间格式对象 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss" ); 列表 list = userMapper.getList(); //循环执行时格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式的时间(日期->字符串) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;}
程序执行结果如下:
从上面的结果可以看出,时间格式没有问题,也正是我们所期望的。但细心的读者会发现,为什么接口的返回字段发生了变化呢? (之前的字段是createtime,但现在是ctime...)这是因为使用#SimpleDateFormat.format方法后,返回的是一个String类型的结果,而我们之前的创建时间 和 更新时间字段均为日期类型,因此无法接收时间格式化的结果。 所以这时候我们需要在实体类UserInfo中添加两个字符串类型的“时间”字段,然后隐藏之前的Data类型的时间字段,并且最后实体类UserInfo的实现代码如下: 导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入 java.www.sychzs.cn; @DatapublicclassUserInfo{私人intid; private String username; @JsonIgnore //输出结果时隐藏该字段 私人 日期创建时间; // 时间格式字段 private String ctime; @JsonIgnore //输出结果时隐藏该字段 private date UpdateTime;//时间格式格式字段private字符串utime;}} 我们可以使用@JsonIgnore注释来隐藏字段。隐藏后执行结果如下: 3.DateTimeFormatter 格式化 JDK 8之后,我们可以使用DateTimeFormatter来替代SimpleDateFormat,因为SimpleD ate Format 不是线程安全的,而 DateTimeFormatter 是线程安全的 是安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 进行时间格式化。 DateTimeFormatter 格式化代码类似于SimpleDateFormat。具体实现如下:@RequestMapping("/列表")公共列表 getList(){ //定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List 列表= userMapper .getList(); //循环执行时间格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式化时间(Date - >String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 执行结果如下: DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;} 我们可以使用LocalDateTime来接收MySQL中的datetime 类型。 4.全局时间重置 以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢? 答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。 首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 设置完成后,我们将恢复原来的UserInfo和UserController。 UserInfo实现代码如下: 导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;} UserController实现代码: @RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();} 然后我们运行程序,看到如下执行结果: 从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
从上面的结果可以看出,时间格式没有问题,也正是我们所期望的。但细心的读者会发现,为什么接口的返回字段发生了变化呢? (之前的字段是createtime,但现在是ctime...)
ctime
这是因为使用#SimpleDateFormat.format方法后,返回的是一个String类型的结果,而我们之前的创建时间 和 更新时间字段均为日期类型,因此无法接收时间格式化的结果。
#SimpleDateFormat.format
String
创建时间
更新时间
日期
所以这时候我们需要在实体类UserInfo中添加两个字符串类型的“时间”字段,然后隐藏之前的Data类型的时间字段,并且最后实体类UserInfo的实现代码如下:
UserInfo
Data
导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入 java.www.sychzs.cn; @DatapublicclassUserInfo{私人intid; private String username; @JsonIgnore //输出结果时隐藏该字段 私人 日期创建时间; // 时间格式字段 private String ctime; @JsonIgnore //输出结果时隐藏该字段 private date UpdateTime;//时间格式格式字段private字符串utime;}
我们可以使用@JsonIgnore注释来隐藏字段。隐藏后执行结果如下:
@JsonIgnore
3.DateTimeFormatter 格式化 JDK 8之后,我们可以使用DateTimeFormatter来替代SimpleDateFormat,因为SimpleD ate Format 不是线程安全的,而 DateTimeFormatter 是线程安全的 是安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 进行时间格式化。 DateTimeFormatter 格式化代码类似于SimpleDateFormat。具体实现如下:@RequestMapping("/列表")公共列表 getList(){ //定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List 列表= userMapper .getList(); //循环执行时间格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式化时间(Date - >String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;} 执行结果如下: DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;} 我们可以使用LocalDateTime来接收MySQL中的datetime 类型。 4.全局时间重置 以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢? 答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。 首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 设置完成后,我们将恢复原来的UserInfo和UserController。 UserInfo实现代码如下: 导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;} UserController实现代码: @RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();} 然后我们运行程序,看到如下执行结果: 从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
JDK 8之后,我们可以使用DateTimeFormatter来替代SimpleDateFormat,因为SimpleD ate Format 不是线程安全的,而 DateTimeFormatter 是线程安全的 是安全的,所以如果是 JDK 8 以上的项目,尽量使用 DateTimeFormatter 进行时间格式化。
DateTimeFormatter
SimpleD ate Format
DateTimeFormatter 格式化代码类似于SimpleDateFormat。具体实现如下:
@RequestMapping("/列表")公共列表 getList(){ //定义时间格式化对象 DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); List 列表= userMapper .getList(); //循环执行时间格式化 list.forEach(item -> { //使用保留字段ctime接收createtime格式化时间(Date - >String) item.setCtime(dateFormat.format(item.getCreatetime())); item.setUtime(dateFormat.format(item.getUpdatetime())); }); 返回列表;}
执行结果如下:
DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;} 我们可以使用LocalDateTime来接收MySQL中的datetime 类型。 4.全局时间重置 以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢? 答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。 首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 设置完成后,我们将恢复原来的UserInfo和UserController。 UserInfo实现代码如下: 导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;} UserController实现代码: @RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();} 然后我们运行程序,看到如下执行结果: 从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
DateTimeFormatter 和 SimpleDateFormat 的用法区别在于 DateTimeFormatter 用于格式化 J DK 8 提供的时间类型,如LocalDateTime,而SimpleDateFormat用于格式化Date类型,所以我们需要对UserInfoer实体类进行如下修改:
LocalDateTime
Date
导入 com.fasterxml.jackson.annotation.JsonIgnore;导入www.sychzs.cn;导入java.time.LocalDateTime; @Data公共 类 用户信息 { 私人 int id; 私人 String username; @JsonIgnore private LocalDateTime createtime; private字符串ctime;@JsonIgnoreprivate LocalDateTime updatetime; private 字符串 utime;}
我们可以使用LocalDateTime来接收MySQL中的datetime 类型。
datetime
以上七项整理整理的实现都有一个致命的缺点,它们在进行时间修改整理的时候,都需要对核心业务类做一定的,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢?
答案是:有的。我们可以不修改任何代码,只需要在配置文件中设置一下就可以实现时间清理的功能了。
首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:
# 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8
设置完成后,我们将恢复原来的UserInfo和UserController。
导入www.sychzs.cn;导入www.sychzs.cn;@Datapublic 班级用户信息{私人intid; private 字符串用户名; private 日期创建时间;私人日期更新时间;}
UserController实现代码:
@RequestMapping("/列表")公共列表 getList(){ return userMapper.getList();}
然后我们运行程序,看到如下执行结果:
从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。 实现原理分析 为什么所有时间字段只要在配置文件中设置就可以格式化? # 格式化全球时间字段 www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss# 指定时区类型 spring.jackson.time-zone= GMT +8 这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。 为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”? 最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。 什么是 GMT? 时区设置中的“GMT”是什么意思? 格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。 GMT 格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。 不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。 根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。 5。部分时间格式化 在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。 我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;} 修改代码后,运行项目结果如下: 从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
从上面的结果和代码可以看出,我们只需要在程序中进行简单的配置,即可格式化所有时间字段。
为什么所有时间字段只要在配置文件中设置就可以格式化?
这是因为Controller在返回数据时,会自动调用Spring Boot框架内置的JSON框架Jackson,对返回的数据进行统一的JSON格式化。处理过程中会判断配置文件中是否设置。设置“www.sychzs.cn-format=yyyy-MM-dd HH:mm:ss”。如果设置了,Jackson框架在输出时间类型字段时会进行时间格式化,所以我们通过Configure来实现全局时间字段的格式化功能。
为什么需要指定时区类型“spring.jackson.time-zone=GMT+8”?
最现实的原因是,如果我们不指定时区类型,查询到的时间会比预期时间少8个小时。这是因为我们(中国)所在的时区比世界时间少了8个小时。这是由小时引起的,只有我们设置了时区之后,我们的时间查询才会和期望的时间一致。
时区设置中的“GMT”是什么意思?
格林威治标准时间 (GMT) 格林威治标准时间,也称为世界时间。
格林威治是位于英国伦敦南郊的原皇家格林威治天文台所在地。它是地球本初子午线的边界,也是计算世界上时间和经度的起点。它因其航海历史而闻名于世,是本初子午线的标准点,格林威治标准时间也因此得名。这里地势险要,风景优美,既有历史又有风土人情。它也是泰晤士河畔伦敦的东部门户。
不仅天文学家使用格林威治标准时间,这个术语也经常出现在报纸和杂志中。我们知道到处都有当地时间。如果我们用当地时间来记录重大国际事件,将会变得复杂且不方便。而且时间久了就很容易犯错误。因此,天文学家提出了一种大家都能接受且方便的记录方法,那就是以格林威治当地时间为标准。
根据本初子午线的平均午夜计算的平均太阳时。也称为格林威治标准时间或格林威治时间。当地正常时间与世界时间之间的差异等于该地点的地理经度。 1960年之前,它被广泛用作基本的时间测量系统。由于地球自转速度一度被认为是均匀的,所以1960年之前世界时被认为是均匀时间。由于地球自转速度变化的影响,它不是一个均匀的时间系统。它与原子时间或机械时间没有理论上的关系。它们只能通过观察进行比较。后来,世界时相继被历书时和原子时取代,但在日常生活、天文导航、大地测量和太空飞行中仍然是必需的。同时,世界时反映了地球自转速率的变化,是地球自转参数之一。仍然是天文学和地球物理学的基本信息。
在某些场景下,我们不需要统一处理全球时间。在这种情况下,我们可以使用注解来格式化一些时间字段。
我们需要在实体类UserInfo中添加@JsonFormat注解,这样就可以实现时间格式化功能了。实现代码如下:
@JsonFormat
导入 com.fasterxml.jackson.annotation.JsonFormat;导入www.sychzs.cn;导入www.sychzs.cn; @Data公共类用户信息 {私人intid; private String username; //格式化createtime字段 @JsonFormat (模式 = "yyyy-MM -dd hh: mm:ss",时区 = "GMT+8")私有日期创建时间; 私人 日期更新时间;}
修改代码后,运行项目结果如下:
从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。 总结本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。 如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。 参考文献和致谢 www.sychzs.cn/p/49fb78bca621 www.sychzs.cn/item/世界时/692237 推荐 java面试题圣经 技术卷入组,一起学习吧! ! PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!
从上面的结果可以看出,使用注释也可以实现时间格式化。 其实现原理与第四次格式化类似。它们都在返回数据之前对相应字段进行时间格式化。
本文介绍了5种实现时间格式化的方法,其中第一种是前端时间格式化方法,最后4种是后端格式化方法,SimpleDateFormat和 DateTimeFormatter格式化方法比较适合普通的Java项目,其中SimpleDateFormat是非线程安全的,而 DateTimeFormatter 是线程安全的,但是它们不是 Spring Boot 项目中的最佳时间格式化解决方案。
如果是Spring Boot项目,建议使用第四种全局时间格式化或者第五种本地时间格式化方法。这两种实现方式不需要修改核心业务代码,只需要简单的配置。即可完成时间格式化功能。
www.sychzs.cn/p/49fb78bca621
www.sychzs.cn/item/世界时/692237
推荐
java面试题圣经
技术卷入组,一起学习吧! !
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!