最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文分享Java日期解析的完整方案(覆蓋50+種格式自動識別)

 更新時間:2026年06月02日 08:49:45   作者:pan-common  
寫后端接口,日期解析是個躲不過去的坎,本文主要和大家分享一下Java中日期解析的完整方案,一個方法可以覆蓋50+種格式自動識別,希望對大家有所幫助

寫后端接口,日期解析是個躲不過去的坎。

前端傳 "2024-01-15",Excel 導出的文件里是 "2024/01/15",財務系統對接傳的是 "20240115",移動端有時候還扔一個 "2024年1月15日" 過來。更煩人的是,有時候同一個接口,同一個參數,上游不同調用方傳不同的格式——你得一個個兼容。

網上搜 “Java 日期解析”,清一色教你這么寫:

// 經典做法:寫一堆 try-catch
public static Date parse(String dateStr) {
    String[] patterns = {
        "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd", "yyyy/MM/dd HH:mm:ss",
        "yyyy/MM/dd", "yyyyMMddHHmmss", "yyyyMMdd",
        // ... 寫幾十個
    };
    for (String pattern : patterns) {
        try {
            return DateUtil.parse(dateStr, pattern);
        } catch (Exception e) { }
    }
    throw new IllegalArgumentException("無法解析: " + dateStr);
}

代碼冗長不說,性能也有問題——解析 "2024年1月15日" 要先試前面 40 多個常規(guī)格式,每個都走一遍 DateTimeFormatter.parse,失敗、拋異常、catch 吞掉,再試下一個。

DateParserUtils 換了個思路:先看字符串有什么分隔符,直接跳到對應格式組,不遍歷。

引入依賴

<!-- Spring Boot 2.x -->
<dependency>
  <groupId>com.gitee.apanlh</groupId>
  <artifactId>apanlh-common</artifactId>
  <version>2.0.6</version>
</dependency>

Spring Boot 3.x 項目:

<dependency>
  <groupId>com.gitee.apanlh</groupId>
  <artifactId>apanlh-common</artifactId>
  <version>3.0.6</version>
</dependency>

JDK 8+ 可用,零強制依賴。

自動識別,不傳 pattern

// 橫線分隔
DateParserUtils.toLocalDateTime("2024-01-15 10:30:45");
// → 2024-01-15T10:30:45

// 斜杠分隔
DateParserUtils.toLocalDateTime("2024/01/15 10:30:45");
// → 2024-01-15T10:30:45

// 點分隔
DateParserUtils.toLocalDateTime("2024.01.15 10:30:45");
// → 2024-01-15T10:30:45

// 緊湊格式(無分隔符)
DateParserUtils.toLocalDateTime("20240115103045");
// → 2024-01-15T10:30:45

// 中文格式
DateParserUtils.toLocalDateTime("2024年1月15日 10時30分45秒");
// → 2024-01-15T10:30:45

// ISO 格式(帶 T 和納秒)
DateParserUtils.toLocalDateTime("2024-01-15T10:30:45.123456789");
// → 2024-01-15T10:30:45.123456789

一個 toLocalDateTime(String) 方法不傳 pattern,底層自動識別不會在無效格式上浪費時間。

純日期、純時間也一樣

// 日期解析 —— 同樣自動識別
DateParserUtils.toLocalDate("2024-01-15");        // 橫線
DateParserUtils.toLocalDate("2024/01/15");        // 斜杠
DateParserUtils.toLocalDate("2024.01.15");        // 點
DateParserUtils.toLocalDate("2024_01_15");        // 下劃線
DateParserUtils.toLocalDate("20240115");          // 緊湊
DateParserUtils.toLocalDate("2024年1月15日");     // 中文

// 時間解析
DateParserUtils.toLocalTime("10:30:45");          // 冒號
DateParserUtils.toLocalTime("10.30.45");          // 點
DateParserUtils.toLocalTime("10時30分45秒");      // 中文
DateParserUtils.toLocalTime("103045");            // 緊湊

日期額外支持下劃線分隔,時間支持冒號、點、中文、緊湊四種格式。

tryTo* 降級:類型不兼容時自動處理

實際開發(fā)經常遇到:上游傳了 "2024-01-15 14:30:45",但你的業(yè)務只需要日期。用 toLocalDate 解析會失敗,因為格式組里有時間部分。

tryToLocalDate 一行搞定:

// 傳了日期時間字符串,但只需要日期 → 自動截取日期部分
DateParserUtils.tryToLocalDate("2024-01-15 14:30:45");
// → 2024-01-15

// 傳了純日期,但需要日期時間 → 自動補當前時間
DateParserUtils.tryToLocalDateTime("2024-01-15");
// → 2024-01-15T14:30:45(當前系統時間)

// 傳了日期時間,只需要時間部分
DateParserUtils.tryToLocalTime("2024-01-15 14:30:45");
// → 14:30:45

注意:tryTo 不是"不拋異常"——它只是在類型不匹配時做了降級嘗試。降級也失敗的話,原始異常還是會拋的。

實際開發(fā)中高頻使用的方法

時間戳自動識別

前端有時候傳秒級 1705305045,有時候傳毫秒級 1705305045000。這個方法自動判斷:

DateParserUtils.toLocalDateTime(1705305045L);       // 秒級 → 正確解析
DateParserUtils.toLocalDateTime(1705305045000L);    // 毫秒級 → 正確解析

大于等于 1_000_000_000_000L 當毫秒處理,否則當秒處理。

Date 與 LocalDateTime 互轉

// Date → LocalDateTime
DateParserUtils.toLocalDateTime(new Date());

// LocalDateTime → Date
DateParserUtils.toDate(LocalDateTime.now());

// LocalDate → Date
DateParserUtils.toDate(LocalDate.now());

// LocalTime → Date(自動用當天日期組合)
DateParserUtils.toDate(LocalTime.of(14, 30));

字符串 → 秒/毫秒時間戳

DateParserUtils.toTimestamp("2024-01-15 14:30:45");       // 秒
DateParserUtils.toTimestampMillis("2024-01-15 14:30:45"); // 毫秒

自定義格式解析

不走自動識別,直接用指定格式:

DateParserUtils.toLocalDateTime("2024-01-15 14:30:45", "yyyy-MM-dd HH:mm:ss");

// 用 DateTimeFormatter
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
DateParserUtils.toLocalDateTime("2024-01-15 14:30:45", fmt);

全局注冊自定義格式

內置的 50+ 格式覆蓋了絕大部分場景,但如果你們的系統有特殊格式(比如某些老舊系統用 | 分隔),可以注冊全局格式:

// 應用啟動時注冊一次,后續(xù)所有 DateParserUtils 調用都生效
DateParserUtils.addCustomLocalDateTimeFormats(
    DateTimeFormatter.ofPattern("yyyy|MM|dd HH|mm|ss")
);

// 之后直接用
DateParserUtils.toLocalDateTime("2024|01|15 14|30|45");
// → 2024-01-15T14:30:45

自定義格式優(yōu)先級最高(代碼里最先判斷),底層用 ConcurrentHashMap.newKeySet() 存儲,線程安全。分別有 addCustomLocalDateTimeFormats、addCustomLocalDateFormatsaddCustomLocalTimeFormats 三個方法。

DateTimeFormatter 緩存

內部所有 DateTimeFormatter 都通過緩存獲取,預初始化了 17 種常用格式,后續(xù)調用直接命中緩存,減少 pattern 字符串的 hash 比較開銷:

public static DateTimeFormatter getFormat(String format) {
    return DATE_FORMAT_CACHE.get(format, () -> DateTimeFormatter.ofPattern(format));
}

性能對比

測試環(huán)境:JMH 1.37 / JDK 25

Benchmark                                pan-common    Hutool 5.8.44    倍數
────────────────────────────────────────────────────────────────────────────
日期解析 "2026-05-31 14:30:45"            5,076 ops/ms   566 ops/ms      9.0x
日期解析 "2026/05/31 14:30:45"            5,021 ops/ms   543 ops/ms      9.2x
日期解析 "2026年5月31日 14時30分45秒"      5,264 ops/ms   269 ops/ms     19.6x
日期解析 "20260531143045"                 4,226 ops/ms 3,025 ops/ms      1.4x

不適合的場景

說清楚它不做的事情:

  • 不處理時區(qū)偏移。核心解析用系統默認時區(qū) ZoneId.systemDefault()。多時區(qū)環(huán)境要注意。
  • 純數字時間戳字符串不認。如果前端傳 "1705305045000" 字符串,toLocalDateTime(String) 會當緊湊日期格式去解析。得自己先轉成 long 再調用。
  • tryToLocalTime 對純日期字符串不生效。"2024-01-15" 傳進去不會變成 00:00:00,因為日期組和時間組的分隔符不重疊。

總結

DateParserUtils 的核心價值就是一件事:一個方法覆蓋 50+ 種日期格式,不用傳 pattern,自動識別。分隔符路由的思路不復雜,但實際用起來確實省事——不用再寫那一堆 try-catch 了。

到此這篇關于一文分享Java日期解析的完整方案(覆蓋50+種格式自動識別)的文章就介紹到這了,更多相關Java日期解析內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在SpringBoot里自定義Spring MVC配置的三種方法

    在SpringBoot里自定義Spring MVC配置的三種方法

    SpringBoot幫我們自動配好了 MVC 的核心組件,但實際開發(fā)中,光用默認配置肯定不夠今天就教你 3 種自定義 Spring MVC 配置的方法,從簡單到復雜,新手也能一步步跟著做,需要的朋友可以參考下
    2026-03-03
  • 如何兩步解決maven依賴導入失敗的問題

    如何兩步解決maven依賴導入失敗的問題

    這篇文章主要介紹了如何兩步解決maven依賴導入失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java編程之多線程死鎖與線程間通信簡單實現代碼

    Java編程之多線程死鎖與線程間通信簡單實現代碼

    這篇文章主要介紹了Java編程之多線程死鎖與線程間通信簡單實現代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • Spring MVC打印@RequestBody、@Response日志的方法

    Spring MVC打印@RequestBody、@Response日志的方法

    這篇文章主要介紹了Spring MVC打印@RequestBody、@Response日志的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • 從零搭建腳手架之集成Spring?Retry實現失敗重試和熔斷器模式(實戰(zhàn)教程)

    從零搭建腳手架之集成Spring?Retry實現失敗重試和熔斷器模式(實戰(zhàn)教程)

    在我們的大多數項目中,會有一些場景需要重試操作,而不是立即失敗,讓系統更加健壯且不易發(fā)生故障,這篇文章主要介紹了從零搭建開發(fā)腳手架之集成Spring?Retry實現失敗重試和熔斷器模式,需要的朋友可以參考下
    2022-07-07
  • Java中控制流程語句的深入講解

    Java中控制流程語句的深入講解

    流程控制語句顧名思義就是控制程序走向的語句,其中包括條件語句,分支語句和循環(huán)語句,這篇文章主要給大家介紹了關于Java中控制流程語句的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-10-10
  • Eclipse如何導入Maven項目詳解(新手初學)

    Eclipse如何導入Maven項目詳解(新手初學)

    這篇文章主要介紹了Eclipse如何導入Maven項目詳解(新手初學),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • SpringBoot項目使用協同過濾的實現

    SpringBoot項目使用協同過濾的實現

    協同過濾是一種常用的推薦系統算法,用于預測用戶可能喜歡的物品,本文主要介紹了SpringBoot項目使用協同過濾的實現,感興趣的可以了解一下
    2023-09-09
  • spring事務異?;貪L實例解析

    spring事務異?;貪L實例解析

    這篇文章主要介紹了spring事務異?;貪L實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 使用idea啟動DataX的方法示例

    使用idea啟動DataX的方法示例

    這篇文章主要介紹了使用idea啟動DataX的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01

最新評論

长丰县| 永新县| 襄樊市| 澄城县| 黄冈市| 利辛县| 龙州县| 瓦房店市| 陆河县| 诸暨市| 庆云县| 建宁县| 蓬安县| 黔西县| 韶山市| 庄浪县| 新沂市| 宁城县| 磴口县| 泰宁县| 射阳县| 隆尧县| 丰台区| 宁陕县| 岑溪市| 洪雅县| 肥东县| 大城县| 藁城市| 共和县| 北安市| 三台县| 望奎县| 浦北县| 原平市| 富平县| 建平县| 松溪县| 宁阳县| 藁城市| 苏尼特左旗|