Springboot全局日期格式化

說(shuō)在前邊

最近部門(mén)幾位同事受了一些委屈相繼離職沽瞭,共事三年臨別之際頗有不舍激挪,待一切手續(xù)辦妥帖,寒暄過(guò)后送他們出公司橘蜜,幾個(gè)老哥臨別時(shí)沖我鬼魅一笑菊匿,我頓時(shí)心里一緊有種不好的預(yù)感,這事絕對(duì)沒(méi)有這么簡(jiǎn)單扮匠。等我接手這幾個(gè)大佬的項(xiàng)目后捧请,應(yīng)驗(yàn)了我的預(yù)感,此刻我居然有點(diǎn)后悔棒搜,為啥送別之時(shí)沒(méi)揍他們一頓!哈哈哈~ 而這種打人的沖動(dòng)活箕,在我開(kāi)始優(yōu)化幾位老哥的項(xiàng)目時(shí)候力麸,變得越來(lái)越強(qiáng)烈。

有個(gè)坑

技術(shù)部每個(gè)月都會(huì)組織一下代碼走查及優(yōu)化,以前是各自審查優(yōu)化自己的項(xiàng)目克蚂,如今幾位老哥的離職他們的項(xiàng)目就落到了我的頭上闺鲸。對(duì)于程序員來(lái)說(shuō)最痛苦的事情就是接手別人的項(xiàng)目,還要做優(yōu)化改造埃叭,因?yàn)檫@一點(diǎn)也不比重構(gòu)一遍項(xiàng)目簡(jiǎn)單摸恍。不過(guò),軍令在前赤屋,沒(méi)辦法硬著頭皮上吧立镶!

第一個(gè)優(yōu)化的點(diǎn)就讓我有點(diǎn)崩潰,這幾個(gè)大佬的技能能力很強(qiáng)类早,一直都是我學(xué)習(xí)的榜樣媚媒,但在項(xiàng)目里幾乎所有的日期格式化都這樣用?SimpleDateFormat?,像如下代碼這樣實(shí)現(xiàn)涩僻,emm~ 缭召,受過(guò)傷的男人怎么啥事都做的出來(lái),哈哈哈~

SvcOrderDailyStatisticsPo orderDailyStatisticsPo =newSvcOrderDailyStatisticsPo();SimpleDateFormat dateFormat =newSimpleDateFormat("yyyy-MM-dd");DatestationTime = dateFormat.parse(dateFormat.format(svcWorkOrderPo.getPayEndTime()));orderDailyStatisticsPo.setStatisticalDate(stationTime);

而且項(xiàng)目中的時(shí)間和日期A(yíng)PI用的也比較混亂逆日,考慮到?java.util.Date?和?java.util.Calendar?不支持時(shí)區(qū)嵌巷,且非線(xiàn)程安全,對(duì)于日期的計(jì)算相對(duì)繁瑣室抽,技術(shù)部一致要求用JDK1.8以后的?java.time?LocalDateTime?晴竞。但不少人還是在用?java.util.Date?和?java.util.Calendar?處理日期。

優(yōu)化方案

時(shí)間格式化是使用頻率非常高的狠半,如何讓時(shí)間格式化變得既簡(jiǎn)單又不用重復(fù)造輪子噩死,那么就應(yīng)將它抽象出來(lái),作為全局的日期格式化處理神年,下面就結(jié)合實(shí)踐簡(jiǎn)單介紹下幾種優(yōu)化方案已维。

測(cè)試地址:?http://127.0.0.1:8080/timeTest

@GetMapping("/timeTest")publicOrderInfotimeTest(){? ? ? ? OrderInfo order =newOrderInfo();? ? ? ? order.setCreateTime(LocalDateTime.now());? ? ? ? order.setUpdateTime(newDate());returnorder;? ? }

1、@JsonFormat注解

使用?@JsonFormat?注解格式化時(shí)間已日,應(yīng)該算是一個(gè)基本操作了垛耳,大部分開(kāi)發(fā)者都應(yīng)用此種方式,簡(jiǎn)單方便飘千。

/** *@Author: xiaofu *@Description: */publicclassOrderInfo{@JsonFormat(locale ="zh", timezone ="GMT+8", pattern ="yyyy-MM-dd HH:mm:ss")privateLocalDateTime createTime;@JsonFormat(locale ="zh", timezone ="GMT+8", pattern ="yyyy-MM-dd HH:mm:ss")privateDate updateTime;publicLocalDateTime getCreateTime() {returncreateTime;? ? }publicvoid setCreateTime(LocalDateTime createTime) {this.createTime = createTime;? ? }publicDate getUpdateTime() {returnupdateTime;? ? }publicvoid setUpdateTime(Date updateTime) {this.updateTime = updateTime;? ? }}

測(cè)試一下結(jié)果堂鲜,發(fā)現(xiàn)?Date?類(lèi)型和?LocalDateTime?類(lèi)型都格式化成功,但還是有個(gè)問(wèn)題护奈,這樣做仍然比較繁瑣缔莲,每個(gè)實(shí)體類(lèi)的日期字段都要加?@JsonFormat?注解,重復(fù)的工作量也不小霉旗。接著往下看~

2痴奏、全局配置 (1)

Springboot?已經(jīng)為我們提供了日期格式化?${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}?蛀骇,這里我們需要進(jìn)行全局配置,配置比較簡(jiǎn)單读拆,也無(wú)需在實(shí)體類(lèi)屬性上添加?@JsonFormat?注解擅憔。

/** *@Author: xiaofu *@Description: */publicclassOrderInfo{//@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")privateLocalDateTime createTime;//@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")privateDate updateTime;publicLocalDateTimegetCreateTime(){returncreateTime;? ? }publicvoidsetCreateTime(LocalDateTime createTime){this.createTime = createTime;? ? }publicDategetUpdateTime(){returnupdateTime;? ? }publicvoidsetUpdateTime(Date updateTime){this.updateTime = updateTime;? ? }}

只需要用?@Configuration?定義一個(gè)配置類(lèi),注入兩個(gè)?Bean?即可完成全局日期格式化處理檐晕,這種方式也是當(dāng)前我項(xiàng)目中正在用的方式暑诸。

/** *@Author: xiaofu *@Description: */@ConfigurationpublicclassLocalDateTimeSerializerConfig{@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")privateString pattern;@BeanpublicLocalDateTimeSerializer localDateTimeDeserializer() {returnnew LocalDateTimeSerializer(DateTimeFormatter.ofPattern(pattern));? ? }@BeanpublicJackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {returnbuilder -> builder.serializerByType(LocalDateTime.class, localDateTimeDeserializer());? ? }}

這種方式可支持?Date?類(lèi)型和?LocalDateTime?類(lèi)型并存,那么有一個(gè)問(wèn)題就是現(xiàn)在全局時(shí)間格式是?yyyy-MM-dd HH:mm:ss?辟灰,但有的字段卻需要?yyyy-MM-dd?格式咋整个榕?

那就需要配合?@JsonFormat?注解使用,在特定的字段屬性添加?@JsonFormat?注解即可伞矩,因?yàn)?@JsonFormat?注解優(yōu)先級(jí)比較高笛洛,會(huì)以?@JsonFormat?注解標(biāo)注的時(shí)間格式為主。

3乃坤、全局配置 (2)

這種全局配置的實(shí)現(xiàn)方式與上邊的效果是一樣的苛让,不過(guò),要注意的是使用這種配置后湿诊,字段手動(dòng)配置?@JsonFormat?注解將不再生效狱杰。

/** *@Author: xiaofu *@Description: */publicclassOrderInfo{//@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")privateLocalDateTime createTime;//@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")privateDate updateTime;publicLocalDateTimegetCreateTime(){returncreateTime;? ? }publicvoidsetCreateTime(LocalDateTime createTime){this.createTime = createTime;? ? }publicDategetUpdateTime(){returnupdateTime;? ? }publicvoidsetUpdateTime(Date updateTime){this.updateTime = updateTime;? ? }}

/**

* @Author: xiaofu

* @Description:

*/@ConfigurationpublicclassLocalDateTimeSerializerConfig{@Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")privateStringpattern;@Bean@PrimarypublicObjectMapperserializingObjectMapper() {ObjectMapperobjectMapper =newObjectMapper();JavaTimeModulejavaTimeModule =newJavaTimeModule();? ? ? ? javaTimeModule.addSerializer(LocalDateTime.class,newLocalDateTimeSerializer());? ? ? ? javaTimeModule.addDeserializer(LocalDateTime.class,newLocalDateTimeDeserializer());? ? ? ? objectMapper.registerModule(javaTimeModule);returnobjectMapper;? ? }? ? publicclassLocalDateTimeSerializerextendsJsonSerializer<LocalDateTime>{@Overridepublic void serialize(LocalDateTimevalue,JsonGeneratorgen,SerializerProviderserializers)throwsIOException{? ? ? ? ? ? gen.writeString(value.format(ofPattern(pattern)));? ? ? ? }? ? }? ? publicclassLocalDateTimeDeserializerextendsJsonDeserializer<LocalDateTime>{@OverridepublicLocalDateTimedeserialize(JsonParserp,DeserializationContextdeserializationContext)throwsIOException{returnLocalDateTime.parse(p.getValueAsString(), ofPattern(pattern));? ? ? ? }? ? }}

總結(jié)

分享了一個(gè)?Springboot?項(xiàng)目開(kāi)發(fā)過(guò)程中的一個(gè)小技巧,也順便吐槽一下項(xiàng)目?jī)?yōu)化中遇到的坑厅须,優(yōu)化別的人的代碼雖然是一件比較痛苦的事情仿畸,但在這個(gè)過(guò)程中確實(shí)能學(xué)習(xí)到很多技巧,對(duì)個(gè)人的技能提升也是很有幫助朗和,因?yàn)槎际切┠軌驅(qū)崒?shí)在在提高開(kāi)發(fā)效率的干貨错沽。



原文?https://segmentfault.com/a/1190000022355979

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市眶拉,隨后出現(xiàn)的幾起案子千埃,更是在濱河造成了極大的恐慌,老刑警劉巖忆植,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件放可,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡朝刊,警方通過(guò)查閱死者的電腦和手機(jī)耀里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)拾氓,“玉大人冯挎,你說(shuō)我怎么就攤上這事』痉悖” “怎么了织堂?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵叠艳,是天一觀(guān)的道長(zhǎng)奶陈。 經(jīng)常有香客問(wèn)我易阳,道長(zhǎng),這世上最難降的妖魔是什么吃粒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任潦俺,我火速辦了婚禮,結(jié)果婚禮上徐勃,老公的妹妹穿的比我還像新娘事示。我一直安慰自己,他們只是感情好僻肖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布肖爵。 她就那樣靜靜地躺著,像睡著了一般臀脏。 火紅的嫁衣襯著肌膚如雪劝堪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天揉稚,我揣著相機(jī)與錄音秒啦,去河邊找鬼。 笑死搀玖,一個(gè)胖子當(dāng)著我的面吹牛余境,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灌诅,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼芳来,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了猜拾?” 一聲冷哼從身側(cè)響起即舌,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关带,沒(méi)想到半個(gè)月后侥涵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宋雏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年芜飘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磨总。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗦明,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚪燕,到底是詐尸還是另有隱情娶牌,我是刑警寧澤奔浅,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站诗良,受9級(jí)特大地震影響汹桦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鉴裹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一舞骆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧径荔,春花似錦督禽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鹦马,卻和暖如春胧谈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菠红。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工第岖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人试溯。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓蔑滓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親遇绞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子键袱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容