2015-08-25 26 views
7

Tôi muốn xác nhận một số định dạng ngày, như sau ví dụ:Validating Java 8 ngày

YYYY 
YYYY-MM 
YYYY-MM-DD 

Validation phải đảm bảo rằng định dạng ngày là chính xác và cập nhật các tồn tại.

Tôi biết rằng Java 8 cung cấp API ngày mới, vì vậy tôi tự hỏi liệu nó có thể thực hiện được công việc đó hay không.

Có cách nào tốt hơn bằng cách sử dụng API ngày 8 của Java không? Vẫn còn thực hành tốt để sử dụng lớp Lịch với tham số lenient?

+0

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

+1

gì bạn mong đợi như một ngày cho "YYYY"? "YYYY-01-01"? Câu hỏi tương tự cho "YYYY-MM". –

+2

Nó chưa bao giờ là một cách hay để sử dụng lớp 'Lịch'. 'DateFormat' luôn là cái để sử dụng. – Kayaman

Trả lời

4

Để xác định dạng YYYY-MM-DD, bạn chỉ có thể sử dụng LocalDate.parse giới thiệu trong java.time từ JDK 8.

có được một thể hiện của LOCALDATE từ một chuỗi văn bản như 2007/12/03.

Chuỗi phải đại diện cho một ngày hợp lệ và được phân tích cú pháp bằng cách sử dụng DateTimeFormatter.ISO_LOCAL_DATE.

A DateTimeParseException sẽ bị hủy nếu ngày không hợp lệ.

Đối với hai định dạng khác bạn đã cung cấp cho chúng tôi, ngoại lệ sẽ được ném. Điều đó là hợp lý bởi vì chúng không phải là ngày thực, chỉ là một phần của một ngày tháng.


LOCALDATE cũng cung cấp một phương pháp of(int year, int month, int dayOfMonth) do đó nếu bạn thực sự muốn để xác nhận đơn giản là năm trong một số trường hợp, năm với tháng trong trường hợp khác hoặc ngày đầy đủ thì bạn có thể làm điều gì đó như thế này:

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

Lưu ý rằng bạn mentionned một số định dạng nhưng không cung cấp cho họ, vì vậy tôi cho rằng đây là những chỉ 3.

4

bạn có thể chỉ mất ruộng với parseDefaulting để làm cho tất cả các trình định dạng làm việc:

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; 
} 
Các vấn đề liên quan