0
点赞
收藏
分享

微信扫一扫

SpringBoot 时间格式化


SimpleDateFormat格式化

大多数情况下,第 1 个时间格式化的方法是使用 ​​SimpleDateFormat​​ 来进行时间格式化,它也是 JDK 8 之前重要的时间格式化方法,它的核心实现代码如下:

// 定义时间格式化对象和定义格式化样式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 格式化时间对象
String date = dateFormat.format(new Date())

使用 ​​SimpleDateFormat.format​​​ 方法之后,它返回的是一个 ​​String​​​ 类型的结果, 因此​​Date​​类型不能接收时间格式化得结果的。

DateTimeFormatter格式化

JDK 8 之后,我们可以使用 ​​DateTimeFormatter​​​ 来替代 ​​SimpleDateFormat​​​,因为 ​​SimpleDateFormat​​​ 是非线程安全的,而 ​​DateTimeFormatter​​​ 是线程安全的,所以如果是 JDK 8 以上的项目,尽量使用 ​​DateTimeFormatter​​ 来进行时间格式化。

DateTimeFormatter 格式化的代码和 SimpleDateFormat 类似,具体实现如下:

@RequestMapping("/list")
public List<UserInfo> getList() {
// 定义时间格式化对象
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
List<UserInfo> 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​​​ 类型的, 使用 ​​LocalDateTime​​​ 来接收 MySQL 中的 ​​datetime​​ 类型

全局时间格式化

以上两种后端格式化的实现都有一个致命的缺点,它们在进行时间格式化的时候,都需要对核心业务类做一定的修改,这就相当为了解决一个问题,又引入了一个新的问题,那有没有简单一点、优雅一点的解决方案呢?

答案是:有的。我们可以不改任何代码,只需要在配置文件中设置一下就可以实现时间格式化的功能了。

首先,我们找到 Spring Boot 的配置文件 application.properties(或 application.yml),只需要在 application.properties 配置文件中添加以下两行配置:

# 格式化全局时间字段
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
# 指定时间区域类型
spring.jackson.time-zone=GMT+8
这样设置之后,我们将原始的 UserInfo 和 UserController 进行还原。

实现原理分析

为什么在配置文件中设置一下,就可以实现所有时间字段的格式化了呢?

# 格式化全局时间字段
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 框架在对时间类型的字段输出时就会执行时间格式化的处理,这样我们就通过配置来实现全局时间字段的格式化功能了。

部分时间格式化

某些场景下,我们不需要对全局的时间都进行统一的处理,这种情况我们可以使用注解的方式来实现部分时间字段的格式化。

我们需要在实体类 UserInfo 中添加 ​​@JsonFormat​​ 注解,这样就可以实现时间的格式化功能了,实现代码如下:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;

import java.util.Date;

@Data
public class UserInfo {
private int id;
private String username;
// 对 createtime 字段进行格式化处理
@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
private Date createtime;
private Date updatetime;
}

总结

​SimpleDateFormat​​​ 和 ​​DateTimeFormatter​​​ 格式化的方法更适用普通的 Java 项目,其中 ​​SimpleDateFormat​​​ 是非线程安全的,而 ​​DateTimeFormatter​​ 是线程安全的,但它们都不是 Spring Boot 项目中最优的时间格式化方案。


举报

相关推荐

0 条评论