我正在使用DateFormat setLenient()解析字符串并验证日期。但是即使我输入了错误的年份(如2位数字或3位数字的year),我也无法验证年份。仅当我通过扫描仪给出日期时,请告诉我如何解析4位数字的年份。

    Scanner sc1 = new Scanner(System.in);
    System.out.println("enter date");
    String date1 = sc1.nextLine();
    String pattern="yyyy-MM-dd HH:mm:ss";
    DateFormat formatter= new SimpleDateFormat(pattern);
    formatter.setLenient(false);
    try {
         {
            formatter.parse(date1);
            System.out.println("valid date");
        }
    } catch (ParseException ex) {
        System.out.println("invalid date");
    }

最佳答案

您应该改用DateTimeFormatterDateTimeFormatter在接受和不接受的字符串上要严格得多。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
try {
    formatter.parse(date1);
    System.out.println("valid date");
} catch (DateTimeParseException ex) {
    System.out.println("invalid date");
}


setLenient与年份是两位数还是四位数没有太大关系。这里的“ Lenient”与Calendar中的含义相同。它用于确定像2019-01-32这样的日期是否会自动变为2019-02-01,我发现这很少有用。如果您还希望在SimpleDateFormat中执行这种宽松的DateTimeFormatter行为,则需要使用:

String pattern = "uuuu-MM-dd HH:mm:ss";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern)
                                .withResolverStyle(ResolverStyle.STRICT);
try {
    LocalDateTime.parse(date1, formatter);
    System.out.println("valid date");
} catch (DateTimeParseException ex) {
    System.out.println("invalid date");
}

关于java - 带年份的SetLenient(false),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57370572/

10-16 17:00