Java日期工具類時(shí)間校驗(yàn)實(shí)現(xiàn)
嘚吧嘚
時(shí)間校驗(yàn)這個(gè)問題,我在網(wǎng)上找了很多資料,有用正則表達(dá)式的、有用格式工具類的。
其實(shí)都能實(shí)現(xiàn)時(shí)間校驗(yàn),既然兩種方式都能實(shí)現(xiàn),那么使用哪種方式更好呢?
先告訴大家一個(gè)結(jié)論吧,我更傾向于用日期工具類來實(shí)現(xiàn)。接下來給大家分析一下。
正則表達(dá)式
版本一
先來看一個(gè)簡單的日期的正則表達(dá)式的規(guī)則,年份4位數(shù)字,月份2位數(shù)字,日2位數(shù)字,時(shí)2位數(shù)字,分2位數(shù)字,秒2位數(shù)字。
String regex = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$";
但是日期校驗(yàn)真的是簡單的幾位數(shù)字的組合嗎?咱們來做個(gè)測試
注意看第二個(gè)日期“2022-13-31 32:12:21”,這明顯是個(gè)錯(cuò)誤的日期,沒有13月,也沒有32時(shí),但是根據(jù)正則表達(dá)式來判斷的話,是符合規(guī)則的。所以說明我們的正則表達(dá)式的規(guī)則是不完善的。
版本二
1、年的規(guī)則就是4位數(shù)字(這里就這么簡單,也可以從19XX年開始)
2、月的2位數(shù)字的范圍是01-12
3、日的2位數(shù)字的范圍是01-31
4、時(shí)的2位數(shù)字的范圍是00-23
5、分的2位數(shù)字的范圍是00-59
5、秒的2位數(shù)字的范圍是00-59
于是可以得到下面這個(gè)正則表達(dá)式:
String regex = "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1]) ([0-2][0-3]):([0-5][0-9]):([0-5][0-9])$";
進(jìn)過測試可以看到2022-13-31 32:12:21
這個(gè)日期已經(jīng)被判定為錯(cuò)誤日期了。
可是這就完了嗎?當(dāng)然沒有,在來看個(gè)例子:
日期中還有一個(gè)特點(diǎn)就是,每4年會(huì)閏年,所以2月的最后一天到幾號(hào),就不是那么簡單了
所以現(xiàn)在的表達(dá)式還需要完善閏年的規(guī)則。。。
版本三
閏年的規(guī)則如下:
(不知道的趕緊學(xué)習(xí)一下,這都不知道,太丟人了??)
一般的年份:除以4,有余數(shù)的是平年,沒有余數(shù)的是閏年,
整百的年份(世紀(jì)年):那么該年份除以400,有余數(shù)的是平年,沒有余數(shù)的是閏年。
OK,規(guī)則有了,那開始寫正則表達(dá)式吧!
String regex = "這個(gè)正則表達(dá)式我寫不出來??。寫不出來的原因:正則表達(dá)式說白了只是個(gè)模板,好像不能做復(fù)雜的邏輯判斷。"
既然自己寫不出來,那就去網(wǎng)上查一下資料,看一下其他大神是怎么實(shí)現(xiàn)的。
我找到一個(gè)判斷閏年的,但是前提是他把年份的范圍規(guī)定死了,然后把閏年窮舉出來,然后做一個(gè)簡單的邏輯控制。
也算是一定范圍內(nèi)實(shí)現(xiàn)了日期格式的判定。
也是這個(gè)原因讓我放棄了用正則表達(dá)式,本人對(duì)正則表達(dá)式研究比較淺薄,如果真的可以實(shí)現(xiàn)還希望大佬們可以指點(diǎn)一下。
SimpleDateFormat工具類
使用SimpleDateFormat工具類,就不需要考慮規(guī)則了,這些人家都考慮好了,咱們只需要定義日期格式就行了。
主要原理是:SimpleDateFormat不能格式化、格式化不對(duì)的時(shí)間字符串都是不符合規(guī)則的。
核心代碼如下:
public static boolean isValidDate(String dateStr, String dateFormatPattern) { SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatPattern); dateFormat.setLenient(false); try { Date parsedDate = dateFormat.parse(dateStr); return dateStr.equals(dateFormat.format(parsedDate)); } catch (ParseException e) { return false; } }
再封裝一層
public static boolean isValidDate(String dateStr) { return isValidDate(dateStr, "yyyy-MM-dd HH:mm:ss"); }
測試一下,可以看到日期字符串
和日期格式
只要有一點(diǎn)不一致,就會(huì)被判定為不符合規(guī)則。
然后再測試幾個(gè)錯(cuò)誤時(shí)間,可以看到2022-13-31 32:12:21
和2023-02-31 00:15:00
都被判定為格式錯(cuò)誤了!
終于整理完了!
其實(shí)結(jié)果很簡單,但是我覺得過程也很重要,雖然走了很多彎路,但是值得被記錄下來。??
本來還有想梳理一下關(guān)于LocalDate東西,和java.util.Date對(duì)比一下,有什么區(qū)別,但是考慮到篇幅。。。就不放在一起了。??
到此這篇關(guān)于Java日期工具類時(shí)間校驗(yàn)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java日期時(shí)間校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java導(dǎo)出Excel通用方法的實(shí)例詳解
這篇文章主要介紹了java導(dǎo)出Excel通用方法的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07使用maven創(chuàng)建普通項(xiàng)目命令行程序詳解
大部分使用maven創(chuàng)建的是web項(xiàng)目,這里使用maven創(chuàng)建一個(gè)命令行程序,目的是讓大家了解maven特點(diǎn)和使用方式,有需要的朋友可以借鑒參考下2021-10-10使用Java進(jìn)行FreeMarker的web模板開發(fā)的基礎(chǔ)教程
這篇文章主要介紹了使用Java進(jìn)行FreeMarker模板引擎開發(fā)的基礎(chǔ)教程,文中針對(duì)FreeMarker的網(wǎng)頁標(biāo)簽用法給出了一些例子,需要的朋友可以參考下2016-03-03如何基于ssm框架實(shí)現(xiàn)springmvc攔截器
這篇文章主要介紹了如何基于ssm框架實(shí)現(xiàn)springmvc攔截器,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07MyBatis復(fù)雜Sql查詢實(shí)現(xiàn)示例介紹
在利用mybatis做查詢的時(shí)候,一般返回結(jié)果用resulttype,這種情況必須是查詢的結(jié)果在對(duì)應(yīng) 的pojo類中有對(duì)應(yīng)的,一般都是單表查詢,但是對(duì)于一些復(fù)雜的情況,比如需要用到多表查詢的時(shí)候,resultType不再適用,此時(shí)一般用resultMap來表示返回的結(jié)果2022-12-12關(guān)于activemq安裝配置以及啟動(dòng)錯(cuò)誤的解決
這篇文章主要介紹了關(guān)于activemq安裝配置以及啟動(dòng)錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06關(guān)于Java中的實(shí)體類要?implements?Serializable的原因分析
這篇文章主要介紹了Java中的實(shí)體類為什么要?implements?Serializable,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06