【问题标题】:Java date validation joda timeJava 日期验证 joda 时间
【发布时间】:2015-10-12 13:38:59
【问题描述】:

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

【问题讨论】:

标签: java datetime jodatime


【解决方案1】:

之前的回复应该没问题,但鉴于 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;
}

【讨论】:

【解决方案2】:

我认为这应该对你有用(如果你想保持简单)。
您必须在SimpleDateFormat 上执行setLenient(false)

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

【讨论】:

【解决方案3】:

使用简单日期格式

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;博士

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.DateCalendarSimpleDateFormat

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 2014-03-24
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多