Java日期验证joda时间

问题描述 投票:9回答:4

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

java datetime jodatime
4个回答
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;
    }
}

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;
}

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;
    }
}

4
投票

tl;dr

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'不是闰年


About java.time

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

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

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。你可能会在这里找到一些有用的类,如IntervalYearWeekYearQuartermore

© www.soinside.com 2019 - 2024. All rights reserved.