技术部每个月都会组织一下代码走查及优化,以前是各自审查优化自己的项目,如今几位老哥的离职他们的项目就落到了我的头上。对于程序员来说最痛苦的事情就是接手别人的项目,还要做优化改造,因为这一点也不比重构一遍项目简单。不过,军令在前,没办法硬着头皮上吧!
第一个优化的点就让我有点崩溃,这几个大佬的技能能力很强,一直都是我学习的榜样,但在项目里几乎所有的日期格式化都这样用 SimpleDateFormat ,像如下代码这样实现,emm~ ,受过伤的男人怎么啥事都做的出来,哈哈哈~
SvcOrderDailyStatisticsPo orderDailyStatisticsPo = new SvcOrderDailyStatisticsPo();
SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd”);
Date stationTime = dateFormat.parse(dateFormat.format(svcWorkOrderPo.getPayEndTime()));
orderDailyStatisticsPo.setStatisticalDate(stationTime);
而且项目中的时间和日期API用的也比较混乱,考虑到 java.util.Date 和 java.util.Calendar 不支持时区,且非线程安全,对于日期的计算相对繁琐,技术部一致要求用JDK1.8以后的 java.time LocalDateTime。但不少人还是在用 java.util.Date 和 java.util.Calendar 处理日期。
优化方案
时间格式化是使用频率非常高的,如何让时间格式化变得既简单又不用重复造*,那么就应将它抽象出来,作为全局的日期格式化处理,下面就结合实践简单介绍下几种优化方案。
测试地址:http://127.0.0.1:8080/timeTest
@GetMapping("/timeTest")
public OrderInfo timeTest() {
OrderInfo order = new OrderInfo();
order.setCreateTime(LocalDateTime.now());
order.setUpdateTime(new Date());
return order;
}
1、@JsonFormat注解
使用@JsonFormat注解格式化时间,应该算是一个基本操作了,大部分开发者都应用此种方式,简单方便。
/**
-
@Author: xiaofu
-
@Description:
*/
public class OrderInfo {@JsonFormat(locale = “zh”, timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)
private LocalDateTime createTime;@JsonFormat(locale = “zh”, timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)
private Date updateTime;public LocalDateTime getCreateTime() {
return createTime;
}public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}public Date getUpdateTime() {
return updateTime;
}public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
测试一下结果,发现 Date 类型和 LocalDateTime 类型都格式化成功,但还是有个问题,这样做仍然比较繁琐,每个实体类的日期字段都要加@JsonFormat注解,重复的工作量也不小。接着往下看~ 在这里插入图片描述
2、全局配置 (1)
Springboot 已经为我们提供了日期格式化 ${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss},这里我们需要进行全局配置,配置比较简单,也无需在实体类属性上添加@JsonFormat注解。
/**
-
@Author: xiaofu
-
@Description:
*/
public class OrderInfo {//@JsonFormat(locale = “zh”, timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)
private LocalDateTime createTime;//@JsonFormat(locale = “zh”, timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”)
private Date updateTime;public LocalDateTime getCreateTime() {
return createTime;
}public void setCreateTime(LocalDateTime createTime) {
this.createTime = createTime;
}public Date getUpdateTime() {
return updateTime;
}public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
}
只需要用@Configuration定义一个配置类,注入两个Bean即可完成全局日期格式化处理,这种方式也是当前我项目中正在用的方式。