2015-08-25 82 views
7

我想驗證幾個日期格式,如下面的例子:驗證的Java 8日期

YYYY 
YYYY-MM 
YYYY-MM-DD 

驗證必須確保日期格式是正確的日期存在。

我知道Java 8提供了一個新的Date API,所以我想知道它是否能夠做這樣的工作。

使用Java 8 date API有更好的方法嗎? 使用具有lenient參數的Calendar類仍然是一個好習慣嗎?

+0

http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html – arodriguezdonaire

+1

你有什麼期望爲「YYYY」的日期? 「YYYY-01-01」? 「YYYY-MM」同樣的問題。 –

+2

使用'Calendar'類從來不是一個好習慣。 'DateFormat'總是要使用的。 – Kayaman

回答

4

爲了驗證YYYY-MM-DD格式,你可以簡單地使用LocalDate.parsejava.time介紹,自JDK 8

從文本字符串,如 2007-12-03獲取LOCALDATE的實例。

該字符串必須表示有效日期,並使用 DateTimeFormatter.ISO_LOCAL_DATE進行解析。

如果日期無效,將會拋出A DateTimeParseException

對於您給我們的其他兩種格式,將拋出異常。這是合乎邏輯的,因爲它們不是真正的日期,只是日期的一部分。


LOCALDATE的還提供了一個方法of(int year, int month, int dayOfMonth)因此,如果你真的想當年只是驗證在某些情況下,在其他情況下或完整的日期是本月的一年,那麼你可以做這樣的事情:

你mentionned 多種格式但沒有提供給他們,所以我假定這些
public static final boolean validateInputDate(final String isoDate) 
{ 
    String[] dateProperties = isoDate.split("-"); 

    if(dateProperties != null) 
    { 
     int year = Integer.parseInt(dateProperties[0]); 

     // A valid month by default in the case it is not provided. 
     int month = dateProperties.length > 1 ? Integer.parseInt(dateProperties[1]) : 1; 

     // A valid day by default in the case it is not provided. 
     int day = dateProperties.length > 2 ? Integer.parseInt(dateProperties[2]) : 1; 

     try 
     { 
      LocalDate.of(year, month, day); 
      return true; 
     } 
     catch(DateTimeException e) 
     { 
      return false; 
     } 
    } 

    return false; 
} 

注是唯一的3

4

您可以指定缺少的字段與parseDefaulting到讓所有的格式化工作:

public static boolean isValid(String input) { 
    DateTimeFormatter[] formatters = { 
      new DateTimeFormatterBuilder().appendPattern("yyyy") 
        .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) 
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
        .toFormatter(), 
      new DateTimeFormatterBuilder().appendPattern("yyyy-MM") 
        .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
        .toFormatter(), 
      new DateTimeFormatterBuilder().appendPattern("yyyy-MM-dd") 
        .parseStrict().toFormatter() }; 
    for(DateTimeFormatter formatter : formatters) { 
     try { 
      LocalDate.parse(input, formatter); 
      return true; 
     } catch (DateTimeParseException e) { 
     } 
    } 
    return false; 
}