SpringBoot 全局日期格式化(基于HttpMessageConverter)

還在為日期格式化的問題頭痛宪卿?趕緊閱覽文章尋找答案吧弊攘!

學(xué)習(xí)目標(biāo)

快速學(xué)會使用Jackson消息轉(zhuǎn)換器并實現(xiàn)日期的全局格式化哎榴。

快速查閱

專題閱讀:《SpringBoot 布道系列》

源碼下載:springboot-date-format

— Hey Man菇肃,Don't forget to Star or Fork . —

開始教程

一、全局日期格式化(基于自動配置)

關(guān)于日期格式化首量,很多人會想到使用Jackson的自動配置:

spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.timeZone: GMT+8

這種全局日期格式化固然方便,但在消息傳遞時只能解析特定的時間格式,在實際業(yè)務(wù)開展中并不那么方便加缘。例如某接口返回的是long類型的時間戳鸭叙,顯然此時消息轉(zhuǎn)換器將拋出解析失敗的異常。

那么有沒更好的辦法拣宏,既支持返回默認(rèn)的日期格式沈贝,又支持解析復(fù)雜的日期字符串?
答案是有的勋乾,只需要重寫Jackson的消息轉(zhuǎn)換器來支持解析復(fù)雜的日期格式即可宋下。

二、全局日期格式化(基于消息轉(zhuǎn)換器)

首先在項目引入Jackson辑莫、Thymeleaf等相關(guān)依賴:

       <dependency><!--Web相關(guān)依賴-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency><!--Thymeleaf依賴-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency><!--JSON 解析工具類-->
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <dependency><!--XML 解析工具類-->
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <optional>true</optional>
        </dependency>

然后根據(jù) SimpleDateFormat 來定制支持復(fù)雜日期類型解析的工具類学歧。

    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") {
        //根據(jù)實際業(yè)務(wù)支持各種復(fù)雜格式的日期字符串。
        @Override
        public Date parse(String source) {
            try {
                return super.parse(source);//支持解析指定pattern類型摆昧。
            } catch (Exception e) {
                try {
                    return new StdDateFormat().parse(source);//支持解析long類型的時間戳
                } catch (ParseException e1) {
                    throw new RuntimeException("日期格式非法:" + e);
                }
            }
        }
    };

緊接著根據(jù)使用場景撩满,來介紹如何快速實現(xiàn)日期的格式化。

關(guān)于日期時間格式化的三種使用場景

(1)使用@ResponseBody返回JSON信息會用到MappingJackson2HttpMessageConverter 绅你。

 @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        //設(shè)置解析JSON工具類
        ObjectMapper objectMapper = new ObjectMapper();
        //設(shè)置解析日期的工具類
        objectMapper.setDateFormat(dateFormat);
        //忽略未知屬性 防止解析報錯
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jsonConverter.setObjectMapper(objectMapper);
        List<MediaType> list = new ArrayList<>();
        list.add(MediaType.APPLICATION_JSON_UTF8);
        jsonConverter.setSupportedMediaTypes(list);
        return jsonConverter;
    }

(2)使用@ResponseBody返回XML信息會用到MappingJackson2XmlHttpMessageConverter伺帘。

  @Bean
    public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter() {
        MappingJackson2XmlHttpMessageConverter xmlConverter = new MappingJackson2XmlHttpMessageConverter();
        //設(shè)置解析XML的工具類
        XmlMapper xmlMapper = new XmlMapper();
        //設(shè)置解析日期的工具類
        xmlMapper.setDateFormat(dateFormat);
        //忽略未知屬性 防止解析報錯
        xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        xmlConverter.setObjectMapper(xmlMapper);
        return xmlConverter;
    }

(3)使用ModelAndView返回HTML頁面信息。

值得注意的是忌锯,無論上面哪種消息轉(zhuǎn)換器均無法滿足頁面日期的全局格式化伪嫁,因為th:object默認(rèn)調(diào)用的日期Date的toString方法,所以在Thymemleaf頁面對日期格式化需要借助工具類#dates偶垮。

例如:<input th:value="*{#dates.format(createTime,'yyyy-MM-dd HH:mm:ss')}">

三张咳、測試日期格式化

推薦大家下載源碼對照擼一遍,實踐是檢驗真理的唯一標(biāo)準(zhǔn)似舵。

JAVA代碼:

/**
 * 用戶管理
 */
@RestController
public class UserController {

    /**
     * 打開主頁
     */
    @GetMapping("/")
    public ModelAndView index() {
        ModelAndView mv = new ModelAndView("user/user");
        mv.addObject("user", new User("1", "admin", "123456", new Date()));
        return mv;
    }

    /**
     * 自動根據(jù)請求來判斷返回用戶JSON或XML
     */
    @GetMapping("/user")
    public User get() {
        return new User("1", "admin", "123456", new Date());
    }

    /**
     * 返回用戶JSON
     */
    @GetMapping(value = "/user/json", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public User getJson() {
        return new User("1", "admin", "123456", new Date());
    }

    /**
     * 返回用戶XML
     */
    @GetMapping(value = "/user/xml", produces = MediaType.APPLICATION_XML_VALUE)
    public User getXml() {
        return new User("1", "admin", "123456", new Date());
    }

}

頁面代碼:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>日期格式化</title>
</head>
<body>
<h3><a th:href="@{/}">1.在頁面中對日期格式化</a></h3>
<form th:object="${user}">
    <input th:value="*{userId}" type="hidden">
    賬號:<input th:value="*{username}">
    密碼:<input th:value="*{password}" type="password">
    時間:<input th:value="*{createTime}" type="text">
</form>
<form th:object="${user}">
    賬號:<input th:value="*{username}">
    密碼:<input th:value="*{password}" type="password">
    時間:<input th:value="*{#dates.format(createTime,'yyyy-MM-dd HH:mm:ss')}">
</form>

<h3><a th:href="@{/user/json}">2.點擊獲取JSON信息</a></h3>
<h3><a th:href="@{/user/xml}">3.點擊獲取XML信息</a></h3>
</body>
</html>

啟動項目后訪問 http://localhost:8080 查看日期格式化效果:

四脚猾、小結(jié)

1、使用@ResponseBody會根據(jù)請求頭信息來智能選擇JSON/XML消息轉(zhuǎn)換器砚哗。

2龙助、通過重寫HttpMessageConverter可以自定義消息轉(zhuǎn)換器來實現(xiàn)全局日期格式化。

3蛛芥、采用類似yyyy-MM-dd HH:mm:ss的日期格式更符合國人的閱讀習(xí)慣提鸟,能夠提升用戶體驗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仅淑,一起剝皮案震驚了整個濱河市称勋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涯竟,老刑警劉巖赡鲜,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件空厌,死亡現(xiàn)場離奇詭異,居然都是意外死亡蝗蛙,警方通過查閱死者的電腦和手機蝇庭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捡硅,“玉大人哮内,你說我怎么就攤上這事∽尘拢” “怎么了北发?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喷屋。 經(jīng)常有香客問我琳拨,道長,這世上最難降的妖魔是什么屯曹? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任狱庇,我火速辦了婚禮,結(jié)果婚禮上恶耽,老公的妹妹穿的比我還像新娘密任。我一直安慰自己,他們只是感情好偷俭,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布浪讳。 她就那樣靜靜地躺著,像睡著了一般涌萤。 火紅的嫁衣襯著肌膚如雪淹遵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天负溪,我揣著相機與錄音透揣,去河邊找鬼。 笑死川抡,一個胖子當(dāng)著我的面吹牛辐真,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猖腕,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼拆祈,長吁一口氣:“原來是場噩夢啊……” “哼恨闪!你這毒婦竟也來了倘感?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤咙咽,失蹤者是張志新(化名)和其女友劉穎老玛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蜡豹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年麸粮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镜廉。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡弄诲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娇唯,到底是詐尸還是另有隱情齐遵,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布塔插,位于F島的核電站梗摇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏想许。R本人自食惡果不足惜伶授,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望流纹。 院中可真熱鬧糜烹,春花似錦、人聲如沸捧颅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碉哑。三九已至挚币,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間扣典,已是汗流浹背妆毕。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贮尖,地道東北人笛粘。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像湿硝,于是被迫代替她去往敵國和親薪前。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355