使SimpleDateFormat.parse()在无效date失败(例如,月份大于12)

我使用java.text.SimpleDateFormat来parsing"yyyyMMdd"forms的string。

如果我试图parsing一个大于12的月份的string,而不是失败,它会翻到下一年。 完全可运行的repro:

 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class ParseDateTest { public static void main(String[] args) throws ParseException { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); Date result = format.parse("20091504"); // <- should not be a valid date! System.out.println(result); // prints Thu Mar 04 00:00:00 CST 2010 } } 

我宁愿抛出一个ParseException

有没有强迫exception发生的非哈希方式? 我的意思是,我不想手动检查月份是否大于12。这太荒谬了。

感谢您的任何build议。

注:我已经知道Joda时间,但我需要在普通的JDK没有外部库完成。

你需要使它不宽容 。 从而,

 format.setLenient(false); 

应该这样做。

您可以使用Java 8时间API。 例如,如果你使用一个值为15的月份:

 String strDate = "20091504"; TemporalAccessor ta = DateTimeFormatter.ofPattern("yyyyMMdd").parse(strDate); 

你将直接有一个例外

 Exception in thread "main" java.time.format.DateTimeParseException: Text '20091504' could not be parsed: Invalid value for MonthOfYear (valid values 1 - 12): 15