Java日期验证joda时间

时间:2015-10-12 13:38:59

标签: java datetime jodatime

无论如何要验证给定日期(yyyy-MM-dd)是否为有效日期? 它也应该处理闰年。例如(2015-02-29)应无效。 我将日期作为字符串检索并将其放入joda DateTime对象中。

4 个答案:

答案 0 :(得分:12)

之前的回复应该没问题,但考虑到OP 明确要求Joda-Time版本,这个替代方案也可行:

@Test
public void test() {

    String testDateOk = "2015-02-25"; // Normal date, no leap year
    String testDateOk2 = "2016-02-29"; // Edge-case for leap year
    String testDateWrong = "2017-02-29"; // Wrong date in a non-leap year
    String testDateInvalid = "2016-14-29"; // plain wrong date

    assertTrue(isValidDate(testDateOk));
    assertTrue(isValidDate(testDateOk2));
    assertFalse(isValidDate(testDateWrong));
    assertFalse(isValidDate(testDateInvalid));
}

boolean isValidDate(String dateToValidate){
    String pattern = "yyyy-MM-dd";

    try {
        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
        fmt.parseDateTime(dateToValidate);
    } catch (Exception e) {
        return false;
    }
    return true;
}

答案 1 :(得分:9)

这应该适合你,我想(如果你想保持简单) 您必须setLenient(false) SimpleDateFormat

public static boolean validateDate(String dateString){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    sdf.setLenient(false);
    try {
        sdf.parse(dateString);
        return true;
    } catch (ParseException ex) {
        return false;
    }
}

答案 2 :(得分:5)

使用SimpleDateFormat

public boolean valiDate(String dateString){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    sdf.setLenient(false);
    try {
        Date date = sdf.parse(dateString);
        return true;
    } catch (ParseException ex) {
        return false;
    }
}

答案 3 :(得分:4)

TL;博士

try {  … java.time.LocalDate.parse( input ) … } 
catch ( java.time.format.DateTimeParseException e ) { … }

java.time

Joda-Time项目现在位于maintenance mode,团队建议迁移到java.time类。

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate ld = LocalDate.parse( "2015-02-29" ) ;

要检测无效输入,请捕获DateTimeParseException

String input = "2015-02-29";
try
{
    LocalDate ld = LocalDate.parse( input );
    System.out.println( "ld.toString():  " + ld ) ;
} catch ( DateTimeParseException e )
{
    // … handle exception
    System.out.println( e.getLocalizedMessage( ) );
}
  

文字' 2015-02-29'无法解析:无效的日期' 2月29日'作为' 2015'不是闰年

关于java.time

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

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

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

从哪里获取java.time类?

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