本文收錄在我的博客: 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
項目開發過程當中的一個小技巧,也順便吐槽一下項目優化中遇到的坑,優化別的人的代碼雖然是一件比較痛苦的事情,但在這個過程當中確實能學習到不少技巧,對我的的技能提高也是頗有幫助,由於都是些可以實實在在提升開發效率的乾貨。