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 项目中最优的时间格式化方案。