当前位置:网络安全 > 实现SpringBoot时间格式化的5种方法!

实现SpringBoot时间格式化的5种方法!

  • 发布:2023-10-09 07:17

在我们的日常工作中,时间格式化是很常见的事情,所以这篇文章我们就盘点一下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接口。执行结果如下:

从上面的结果可以看出,时间字段createtimeupdatetime的显示方式非常“乱”,不符合我们的阅读习惯,无法直接显示给前端的用户来说,这个时候,我们需要对时间进行格式化。

时间格式一共有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;

@Data
publicclassUserInfo{
私人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()));
});
返回列表;
}

执行结果如下:

DateTimeFormatterSimpleDateFormat 的用法区别在于 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;
@JsonIgnore
private 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;

@Data
public 班级用户信息{
私人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:因为公众号平台更改了推送规则,如果不想错过内容,记得点击“在看”,加个“星”,这样每次推送新文章,它都会立即出现在你的订阅列表中。 点击“在看”支持我们!

相关文章

热门推荐