Java日期验证

时间:2011-09-07 10:21:06

标签: java date

我需要将用户输入验证为有效日期。用户可以输入dd / mm / yyyy或mm / yyyy(两者都有效)

验证我正在做的事

try{
    GregorianCalendar cal = new GregorianCalendar(); 
    cal.setLenient(false);  
    String []userDate = uDate.split("/");
    if(userDate.length == 3){
        cal.set(Calendar.YEAR, Integer.parseInt(userDate[2]));  
        cal.set(Calendar.MONTH, Integer.parseInt(userDate[1]));  
        cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(userDate[0]));
        cal.getTime(); 
    }else if(userDate.length == 2){
        cal.set(Calendar.YEAR, Integer.parseInt(userDate[1]));  
        cal.set(Calendar.MONTH, Integer.parseInt(userDate[0]));  
        cal.getTime(); 
    }else{
            // invalid date
    }
}catch(Exception e){
    //Invalid date
}

作为GregorianCalendar开始的0月30日,2009年1月30日或12月12日给出了错误。

任何建议如何解决这个问题。

3 个答案:

答案 0 :(得分:11)

使用SimpleDateformat。如果解析失败则抛出ParseException

private Date getDate(String text) throws java.text.ParseException {

    try {
        // try the day format first
        SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
        df.setLenient(false);

        return df.parse(text);
    } catch (ParseException e) {

        // fall back on the month format
        SimpleDateFormat df = new SimpleDateFormat("MM/yyyy");
        df.setLenient(false);

        return df.parse(text);
    }
}

答案 1 :(得分:3)

使用SimpleDateFormat验证DatesetLenient验证false

答案 2 :(得分:1)

TL;博士

使用try - catch来抓取DateTimeParseExceptionLocalDate.parse java.time 类中引发的YearMonth.parse

java.time

现代方法使用 java.time 类。

YearMonth

只有一个月没有一个月的月份,请使用YearMonth课程。

如果可能,让您的用户使用标准ISO 8601格式进行数据输入:YYYY-MM。在解析/生成字符串时, java.time 类默认使用标准格式。

YearMonth ym = YearMonth.parse( "2018-01" ) ;

如果不可能,请指定格式设置模式。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = YearMonth.parse( "01/2018" , f ) ;

要测试无效输入,请捕获异常。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM/uuuu" ) ;
YearMonth ym = null ;
try{
    ym = YearMonth.parse( "01/2018" , f ) ;
} catch ( DateTimeParseException e ) {
    // Handle faulty input
    …
}

LocalDate

对于仅限日期的值,如果没有时间段且没有时区,请使用LocalDate类。

同样,如果可能,使用标准ISO 8601格式进行数据输入:YYYY-MM-DD

LocalDate ld = LocalDate.parse( "2018-01-23" ) ;

如果没有,请指定格式化模式和异常陷阱,如上所示。

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
LocalDate ld = null ;
try{
    ld = LocalDate.parse( "23/01/2018" , f ) ;
} catch ( DateTimeParseException e ) {
    // Handle faulty input
    …
}

结合

如果输入可以是仅日期或年月,则测试输入的长度以确定哪个是。

int length = input.length() ;
switch ( length ) {
    case 7 :
        …  // Process as year-month using code seen above.

    case 10 :
        …  // Process as date-only using code seen above.

    default: 
        …  // ERROR, unexpected input.
}

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore