线上关于SimpleDateFormat踩坑记录
问题描述
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class TestSimpleDateFormat {
public static void main(String[] args) {
System.out.println(isValidDate("0229", "MMdd"));//false
System.out.println(isValidDate("0228", "MMdd"));//true
System.out.println(isValidDate("20230229", "yyyyMMdd"));//false
System.out.println(isValidDate("20240229", "yyyyMMdd"));//true
}
public static boolean isValidDate(String str, String formatStr) {
boolean convertSuccess = true;
SimpleDateFormat format = new SimpleDateFormat(formatStr);
try {
// 严格模式
format.setLenient(false);
format.parse(str);
} catch (ParseException e) {
convertSuccess = false;
e.printStackTrace();
}
return convertSuccess;
}
}
报错信息为
java.text.ParseException: Unparseable date: "0229"
at java.text.DateFormat.parse(DateFormat.java:366)
at com.imooc.TestSimpleDateFormat.isValidDate(TestSimpleDateFormat.java:21)
at com.imooc.TestSimpleDateFormat.main(TestSimpleDateFormat.java:8)
如果当前年份为闰年,日期为2月29号,但是我们要校验的格式不包含年份,那么 SimpleDateFormat 就识别不了闰年,就会将 2月29 当作一个无效日期。
解决方法
- 去掉严格模式,这样 SimpleDateFormat 就不校验日期是否真正有效了,只校验格式。
- 加上年份,这个 SimpleDateFormat 就可以识别闰年了