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

Java中使用正則檢查有效日期的實(shí)現(xiàn)

 更新時(shí)間:2023年10月11日 11:11:19   作者:okokabcd  
要判斷一個(gè)字符串是否符合時(shí)間格式,可以使用正則表達(dá)式,本文主要介紹了Java中使用正則檢查有效日期的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

一、介紹

正則表達(dá)式可用于匹配各種模式,本文將用java中的正則來檢測(cè)給定字符串是否飲包含有效日期

二、日期格式概述

先對(duì)公歷中一個(gè)有效日期做一個(gè)定義,日期格式我們一般定義為yyyy-MM-dd??紤]范圍大小年、閏年等情況,先說閏年。
普通閏年:公歷年份是4的倍數(shù),且不是100的倍數(shù)的,為閏年(如2004年、2020年等就是閏年)。
世紀(jì)閏年:公歷年份是整百數(shù)的,必須是400的倍數(shù)才是閏年(如1900年不是閏年,2000年是閏年)。
有效日期舉例:

  • 2017-12-31
  • 2020-02-29
  • 2400-02-29

無效日期舉例

  • 2017/12/31: 分割符不正確
  • 2018-1-1: 沒有前導(dǎo)0
  • 2018-04-31: 天數(shù)不正確
  • 2100-02-29: 平年2月只有28天

三、實(shí)現(xiàn)

我們要用正則匹配日期,首先先定義一個(gè)接口DateMatcher,只提供一個(gè)匹配方法

public interface DateMatcher {
    boolean matches(String date);
}

下面逐步介紹實(shí)現(xiàn),構(gòu)建一個(gè)完整解決方案

3.1 匹配數(shù)字

創(chuàng)建一個(gè)簡(jiǎn)單的正則來對(duì)字符串進(jìn)行格式約束:

public class FormattedDateMatcher implements DateMatcher {
    private static final Pattern DATE_PATTERN = 
        Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");
    @Override
    public boolean matches(String date) {
        return DATE_PATTERN.matcher(date).matches();
    }
}

這里我們指定了一個(gè)有效日期必須由三組中劃線分割的整數(shù)組成,第一組由4個(gè)整數(shù),其余兩組各有兩個(gè)整數(shù)。
舉例:
匹配的日期: 2017-12-31, 2018-01-31, 0000-00-00, 1029-00-72
不匹配的日期:2018-01, 2018-01-XX, 2020/02/09

3.2 匹配日期的范圍

現(xiàn)在我們成功匹配了一般日期格式,現(xiàn)在我們做進(jìn)一步約束,我們將年份限定在1900-2999,月份和日期也做同樣的約束

^((19|2[0-9])[0-9]{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$

這里我們對(duì)三組整數(shù)范圍做了約束

  • ((19|2[0-9])[0-9]{2}),通過匹配一個(gè)以19開頭或2X開頭后跟幾個(gè)任意數(shù)字的數(shù)字來覆蓋年份的范圍
  • (0[1-9]|1[012]),匹配01-12范圍內(nèi)的月份
  • (0[1-9]|[12][0-9]|3[01]),匹配01-31范圍內(nèi)的天數(shù)

匹配的日期:1900-01-01,2205-02-31,2999-12-31
不匹配的日期:1989-12-31,2018-05-35,2018-13-05,3000-01-01,2018-01-XX

3.3 匹配2月29

為了匹配2月29,首先要判斷閏年,把1900-2099之間的閏年匹配出來。如果一個(gè)數(shù)的后2位能被4整除則原數(shù)也能被4整除;如果后兩位是00,這個(gè)數(shù)能被100整除

^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$

這個(gè)正則由以下部分組成

  • 2000|2400|2800 匹配一組閏年,在1900-2999的范圍內(nèi),匹配能被400整除的
  • 19|20-9 匹配能被4整除不能被100整除的
  • 02-29 匹配2月29

舉例
匹配的日期:2020-02-29,2024-02-29,2400-02-29
不匹配的日期:2019-02-29,2100-02-29,3200-02-29,2020/02/29

3.4 匹配2月28

2月29是閏年,我們還要匹配平年的2月28

^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$

舉例:
匹配的日期: 2018-02-01, 2019-02-13, 2020-02-25
不匹配的日期: 2000-02-30, 2400-02-62, 2018/02/28

3.5. Matching 31-Day Months

3.5 匹配31天的月份

1、3、5、7、8、10、12月份每月31天

^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$

舉例:
匹配的日期: 2018-01-31, 2021-07-31, 2022-08-31
不匹配的日期: 2018-01-32, 2019-03-64, 2018/01/31

3.6 匹配30天的月份

4、6、9、11每月30天

^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$

舉例:
匹配的月份: 2018-04-30, 2019-06-30, 2020-09-30

不匹配的月份: 2018-04-31, 2019-06-31, 2018/04/30

3.7 匯總的日期匹配器

現(xiàn)在我們將上面的所有模式合并成一個(gè)匹配器滿足所有的日期約束

class GregorianDateMatcher implements DateMatcher {
    private static Pattern DATE_PATTERN = Pattern.compile(
      "^((2000|2400|2800|(19|2[0-9])(0[48]|[2468][048]|[13579][26]))-02-29)$" 
      + "|^(((19|2[0-9])[0-9]{2})-02-(0[1-9]|1[0-9]|2[0-8]))$"
      + "|^(((19|2[0-9])[0-9]{2})-(0[13578]|10|12)-(0[1-9]|[12][0-9]|3[01]))$" 
      + "|^(((19|2[0-9])[0-9]{2})-(0[469]|11)-(0[1-9]|[12][0-9]|30))$");
    @Override
    public boolean matches(String date) {
        return DATE_PATTERN.matcher(date).matches();
    }
}

我們使用了"|"來匹配28天的、29天的、30天的、31天的,此時(shí)我們已經(jīng)滿足了開始介紹的日期的所有約束

3.8 性能說明

解析復(fù)雜的表達(dá)式可能會(huì)影響性能。本文的主要目的主要是了解用正則來判斷日期的一種思路,如果要一種可靠且快速的方法來驗(yàn)證日期,請(qǐng)考慮使用Java8提供的LocalDate.parse()。

四、總結(jié)

本文我們學(xué)習(xí)了使用正則表達(dá)式從格式、范圍和月份長度等規(guī)則匹配公歷日期。

到此這篇關(guān)于Java中使用正則檢查有效日期的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java 正則有效日期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea2020.2卡死在reading maven projects

    idea2020.2卡死在reading maven projects

    這篇文章主要介紹了idea2020.2卡死在reading maven projects,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件

    Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件

    這篇文章主要介紹了Java 如何將網(wǎng)絡(luò)資源url轉(zhuǎn)化為File文件的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Mac M1 Maven安裝與配置教程

    Mac M1 Maven安裝與配置教程

    文章詳細(xì)介紹了Maven的安裝配置步驟,包括下載解壓、設(shè)置環(huán)境變量路徑、編輯bash_profile文件,以及修改settings.xml配置本地倉庫和鏡像源,最后通過mvn -v驗(yàn)證配置是否成功
    2025-09-09
  • 關(guān)于SpringCloud?Ribbon替換輪詢算法問題

    關(guān)于SpringCloud?Ribbon替換輪詢算法問題

    Spring?Cloud?Ribbon是基于Netlix?Ribbon實(shí)現(xiàn)的一套客戶端負(fù)載均衡的工具。接下來通過本文給大家介紹SpringCloud?Ribbon替換輪詢算法問題,需要的朋友可以參考下
    2022-01-01
  • activemq整合springboot使用方法(個(gè)人微信小程序用)

    activemq整合springboot使用方法(個(gè)人微信小程序用)

    這篇文章主要介紹了activemq整合springboot使用(個(gè)人微信小程序用),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 一文教你如何使用Java靈活讀取Excel內(nèi)容

    一文教你如何使用Java靈活讀取Excel內(nèi)容

    這篇文章主要給大家介紹了關(guān)于如何使用Java靈活讀取Excel內(nèi)容的相關(guān)資料,讀取Excel數(shù)據(jù)是Java開發(fā)中常見的任務(wù),文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Springboot中項(xiàng)目的屬性配置的詳細(xì)介紹

    Springboot中項(xiàng)目的屬性配置的詳細(xì)介紹

    很多時(shí)候需要用到一些配置的信息,這些信息可能在測(cè)試環(huán)境和生產(chǎn)環(huán)境下會(huì)有不同的配置,本文主要介紹了Springboot中項(xiàng)目的屬性配置的詳細(xì)介紹,感興趣的可以了解一下
    2022-01-01
  • 詳解SpringBoot中時(shí)間類型的序列化與反序列化

    詳解SpringBoot中時(shí)間類型的序列化與反序列化

    這篇文章主要為大家詳細(xì)介紹了SpringBoot中時(shí)間類型的序列化與反序列化的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • 基于Spring AOP的Log收集匯總

    基于Spring AOP的Log收集匯總

    張三針對(duì)公司現(xiàn)有日志處理系統(tǒng)的不足,采用了SpringAOP技術(shù)和Redis存儲(chǔ),設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)性能更高效的日志處理系統(tǒng),該系統(tǒng)通過SpringAOP的切面攔截功能,捕獲方法調(diào)用信息作為日志內(nèi)容,并將其統(tǒng)一格式化后存儲(chǔ)到Redis中
    2024-10-10
  • Spring?Retry實(shí)現(xiàn)重試機(jī)制的示例詳解

    Spring?Retry實(shí)現(xiàn)重試機(jī)制的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Spring-Retry的用法以及實(shí)現(xiàn)原理是怎么樣的,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下
    2023-07-07

最新評(píng)論

梁河县| 乐陵市| 中宁县| 上林县| 台湾省| 广饶县| 红安县| 平南县| 阳曲县| 敦化市| 阳信县| 砀山县| 新巴尔虎右旗| 蒙山县| 宜阳县| 淮滨县| 莱州市| 军事| 泾源县| 剑川县| 灵川县| 彰武县| 如皋市| 岳西县| 屯留县| 那曲县| 巨鹿县| 天等县| 新民市| 赤壁市| 谢通门县| 宁陕县| 龙门县| 丰镇市| 五家渠市| 沐川县| 舒兰市| 遂平县| 昭觉县| 沽源县| 芮城县|