SimpleDateFormat 解析没有给出我预期的响应

SimpleDateFormat parse not giving the response I expected

我有这个Javaclass:

package TestPackage;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

public class TestSimpleDateFormat {

    private static final String DATE_FORMAT = "dd/MM/yyyy";

    private String dob;

    public boolean isValidDate(String day, String month, String year) {
        boolean isValid;
        DateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
        formatter.setLenient(false);
        try {
            formatter.parse(extractDateOfBirthFrom(day, month, year));
            isValid = true;
        }
        catch (ParseException e){
            isValid = false;
        }
        return isValid;
    }

    private String extractDateOfBirthFrom(String day, String month, String year) {
        String dob = day.concat("/").concat(month).concat("/").concat(year);
        return dob;
    }
}

当我 运行 在我的主体中进行以下操作时,我得到的日期验证响应值为 true

TestSimpleDateFormat testSimpleDate = new TestSimpleDateFormat();
System.out.println("Is date valid: " + testSimpleDate.isValidDate("01", "01", "81"));

因为我只传递了 yy 而不是当年的 yyyy,所以我预计验证会失败。是否可以仅强制检查 yyyy

问题是 yy 是正确的,因为 DateFormat 将作为有效年份,然后您需要添加其他验证,可能使用正则表达式来验证日期格式。

也许你可以试试:

try {
        String dob = main.extractDateOfBirthFrom(day, month, year);
        java.util.Date date = formatter.parse(dob);
        isValid = true;
        
        dob.matches("^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$") ? isValid = true : isValid = false;
    }
    catch (ParseException e){
        isValid = false;
    }

tl;博士

您询问了在解析表示日期的文本时如何检测错误输入。

try 
{
    LocalDate.parse( 
        "01/01/81" , 
        DateTimeFormatter.ofPattern( "MM/dd/uuuu" )
    )
}
catch ( DateTimeParseException e )
{
    … handle faulty input
}

java.time.format.DateTimeParseException

:

if there's any way to force validation where the year is yyyy so if yy is used validation will fail.

作为 ,使用现代 java.time 类 多年前取代了可怕的遗留日期时间 类例如 DateCalendarSimpleDateFormat.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ;
String input = "01/01/81" ;  // Two-digit year does not match formatting pattern.
LocalDate ld = LocalDate.parse( input , f ) ;

该代码抛出异常:

java.time.format.DateTimeParseException: Text '01/01/81' could not be parsed at index 6

查看此代码 run live at IdeOne.com

您可以捕获那个 DateTimeParseException 来检测和处理错误的输入。