2015-08-25 3 views
7

Я хотел бы проверить несколько форматов даты, как показано ниже примеров:Validating Java 8 датирует

YYYY 
YYYY-MM 
YYYY-MM-DD 

проверки должны гарантировать, что формат даты правилен и дата существует.

Я знаю, что Java 8 предоставляет новый API дат, поэтому мне интересно, сможет ли он выполнить такую ​​работу.

Есть ли лучший способ использования Java 8 date API? Насколько эффективна практика использования класса Calendar с параметром lenient?

+0

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

+1

Что вы ожидаете в качестве даты «YYYY»? «ГГГГ-01-01»? Тот же вопрос для «ГГГГ-ММ». –

+2

Никогда не было хорошей практики использовать класс «Календарь». 'DateFormat' всегда использовался. – Kayaman

ответ

4

Чтобы проверить формат YYYY-MM-DD, вы можете просто использовать LocalDate.parse введенный в java.time так JDK 8.

Получает экземпляр LocalDate из текстовой строки, такие как 2007-12-03.

Строка должна представлять действительную дату и обрабатывается с использованием DateTimeFormatter.ISO_LOCAL_DATE.

A DateTimeParseException будет выброшен, если дата недействительна.

Для других двух форматов, которые вы нам дали, исключение будет выбрано. Это логично, потому что они не настоящая дата, просто часть даты.


LocalDate также способ of(int year, int month, int dayOfMonth) таким образом, если вы действительно хотите проверить просто год в каком-то случае, год с месяца в другом случае или полной даты, то вы могли бы сделать что-то вроде этого:

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