本文收录在我的博客: http://www.chengxy-nds.top,旨在技术资料共享,共同窗习进步
最近部门几位同事受了一些委屈相继离职,共事三年临别之际很有不舍,待一切手续办妥帖,寒暄事后送他们出公司,几个老哥临别时冲我鬼魅一笑,我顿时内心一紧有种很差的预感,这事绝对没有这么简单。等我接手这几个大佬的项目后,应验了个人预感,此刻我竟然有点后悔,为啥送别之时没揍他们一顿!哈哈哈~ 而这种打人的冲动,在我开始优化几位老哥的项目时候,变得愈来愈强烈。javascript
技术部每月都会组织一下代码走查及优化,之前是各自审查优化本身的项目,现在几位老哥的离职他们的项目就落到了个人头上。对于程序员来讲最痛苦的事情就是接手别人的项目,还要作优化改造,由于这一点也不比重构一遍项目简单。不过,军令在前,没办法硬着头皮上吧!java
第一个优化的点就让我有点崩溃,这几个大佬的技能能力很强,一直都是我学习的榜样,但在项目里几乎全部的日期格式化都这样用 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
处理日期。spring
时间格式化是使用频率很是高的,如何让时间格式化变得既简单又不用重复造轮子,那么就应将它抽象出来,做为全局的日期格式化处理,下面就结合实践简单介绍下几种优化方案。安全
测试地址:http://127.0.0.1:8080/timeTest
app
@GetMapping("/timeTest") public OrderInfo timeTest() { OrderInfo order = new OrderInfo(); order.setCreateTime(LocalDateTime.now()); order.setUpdateTime(new Date()); return order; }
使用@JsonFormat
注解格式化时间,应该算是一个基本操做了,大部分开发者都应用此种方式,简单方便。ide
/** * @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
注解,重复的工做量也不小。接着往下看~学习
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
便可完成全局日期格式化处理,这种方式也是当前我项目中正在用的方式。优化
/** * @Author: xiaofu * @Description: */ @Configuration public class LocalDateTimeSerializerConfig { @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") private String pattern; @Bean public LocalDateTimeSerializer localDateTimeDeserializer() { return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern)); } @Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer()); } }
这种方式可支持 Date
类型和 LocalDateTime
类型并存,那么有一个问题就是如今全局时间格式是yyyy-MM-dd HH:mm:ss
,但有的字段却须要yyyy-MM-dd
格式咋整?
那就须要配合@JsonFormat
注解使用,在特定的字段属性添加@JsonFormat
注解便可,由于@JsonFormat
注解优先级比较高,会以@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; } }
/** * @Author: xiaofu * @Description: */ @Configuration public class LocalDateTimeSerializerConfig { @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") private String pattern; @Bean @Primary public ObjectMapper serializingObjectMapper() { ObjectMapper objectMapper = new ObjectMapper(); JavaTimeModule javaTimeModule = new JavaTimeModule(); javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer()); javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer()); objectMapper.registerModule(javaTimeModule); return objectMapper; } public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(value.format(ofPattern(pattern))); } } public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> { @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext deserializationContext) throws IOException { return LocalDateTime.parse(p.getValueAsString(), ofPattern(pattern)); } } }
分享了一个Springboot
项目开发过程当中的一个小技巧,也顺便吐槽一下项目优化中遇到的坑,优化别的人的代码虽然是一件比较痛苦的事情,但在这个过程当中确实能学习到不少技巧,对我的的技能提高也是颇有帮助,由于都是些可以实实在在提升开发效率的干货。