使 SimpleDateFormat.parse() 在无效日期(例如,month 大于 12)时失败

2022-08-31 17:25:11

我用来解析格式的字符串。java.text.SimpleDateFormat"yyyyMMdd"

如果我尝试解析一个月份大于 12 的字符串,而不是失败,它会滚动到下一年。完全可运行的重现:

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

有没有非黑客的方式来强制异常发生?我的意思是,我不想手动检查月份是否大于12。这有点荒谬。

感谢您的任何建议。

注意:我已经知道Joda Time,但我需要在普通的JDK中完成此操作,而无需外部库。


答案 1

你需要让它变得不宽松。因此

format.setLenient(false);

应该这样做。


答案 2

您可以使用 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