java中SimpleDateFormat解析日期格式的問題
在日常寫代碼的過程中,我們經常要處理各種格式的日期,常見的日期格式有:“20240601”,“2024-06-01”,“2024-6-1”。如何正確地處理日期格式,尤其是對外接口中參數的日期格式,就很重要了,一個不小心就可能出現意想不到的問題。
舉一個我遇到的真實例子:我們提供的對外接口中有一個參數是日期,定義的格式是“yyyyMMdd”,就是說我們要求用戶在調用接口的時候要傳“20240601”這樣格式的日期,但是,接口提供出去,怎么用就是別人的事了…你會發現經常有用戶調用接口的時候,傳“2024-06-01”這樣格式的日期。如果我們不對格式做校驗會出現什么問題呢?
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
Date d = sdf.parse("2024-06-01");
System.out.println(sdf.format(d));
你猜上面這段代碼的輸出是什么?
是:20231206
出現的問題就是:用戶希望查2024年6月1日的數據,接口返回的卻是2023年12月6日的數據。
如何避免這個問題?我們需要對日期格式做強校驗,當用戶傳的日期格式不是我們希望的日期格式的時候,我們就通過報錯來提示用戶。
正好SimpleDateFormat父類DateFormat提供了一個方法:public void setLenient(boolean lenient),這個方法可以控制是否容忍不正確的日期格式,它默認是true,我們需要改成false。就是不容忍錯誤格式,對格式做強驗證。上面的代碼可以改成:
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);
Date d = sdf.parse("2024-06-01");
System.out.println(sdf.format(d));
再運行上面的代碼會拋出異常:Exception in thread “main” java.text.ParseException: Unparseable date: “2024-06-01”
當然,如果你不需要嚴格的日期校驗,不希望代碼拋異常,希望代碼運行得更健壯,你就不要加這句:sdf.setLenient(false); 你需要根據實際情況來做決定。
以上就是我遇到過的SimpleDateFormat解析日期格式的問題。如果你有什么疑問,歡迎留言跟我討論。
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
https://wangxuan.me/tech/2024/06/03/validate-date-format-with-SimpleDateFormat.html
如何正確地校驗日期格式
浙公網安備 33010602011771號