我正在使用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");
}
最佳答案
您应该改用DateTimeFormatter
:DateTimeFormatter
在接受和不接受的字符串上要严格得多。
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/