2015-07-27 46 views
5

Tôi cố gắng sử dụng chức năng này nhưng nó không hoạt động với trường hợp này '12/05/201a 'ai đó biết tại sao xảy ra điều này?SimpleDateFormat không hoạt động như mong đợi

Trong thử nghiệm của tôi, tôi sử dụng số System.out.println(isThisDateValid("12/05/201a", "dd/MM/yyyy")); và câu trả lời là true nhưng tôi cho rằng kết quả sẽ sai vì năm chứa chữ cái.

public static boolean isThisDateValid(String dateToValidate, String dateFromat) 
    { 

     if (dateToValidate == null) 
     { 
      return false; 
     } 

     SimpleDateFormat sdf = new SimpleDateFormat(dateFromat); 
     sdf.setLenient(false); 

     try 
     { 

      //if not valid, it will throw ParseException 
      Date date = sdf.parse(dateToValidate); 
      System.out.println(date); 

     } catch (ParseException e) 
     { 

      e.printStackTrace(); 
      return false; 
     } 

     return true; 
    } 
+0

mất '201' cho' năm'. Nếu bạn đặt tất cả các chữ cái vào vị trí của năm nó sẽ không phân tích cú pháp. Vì nó hy vọng chữ số '1' thay cho' năm'. – Satya

+0

Nó hy vọng ít nhất một chữ số thay cho 'năm'. – Satya

+0

@Reimeus: 'SimpleDateFormat' không * bỏ qua * chữ cái, nó chỉ không tiêu thụ toàn bộ chuỗi. Dưới đây là một ví dụ về nó không bỏ qua các chữ cái: http://ideone.com/gnbTwy –

Trả lời

12

DateFormat#parse không nhất thiết phải sử dụng toàn bộ chuỗi:

phân tích văn bản từ đầu chuỗi cho trước để tạo ra một ngày. Phương pháp này có thể không sử dụng toàn bộ văn bản của chuỗi đã cho.

(nhấn mạnh của tôi)

SimpleDateFormat's docs cho chúng tôi biết rằng yyyy không nhất thiết có nghĩa là nó sẽ yêu cầu bốn chữ số trong một năm:

Năm:

.. .

  • Để phân tích cú pháp, nếu số lượng mẫu chữ cái lớn hơn 2, thì năm được hiểu theo nghĩa đen, bất kể số chữ số. Vì vậy, sử dụng mô hình "MM/dd/yyyy", "01/11/12" phân tích Jan 11, 12 AD

Vì vậy, nó là đúng (nếu có thể ngạc nhiên) mà nó phân tích rằng chuỗi trong năm 201.

Bạn có thể sử dụng parse(String,ParsePosition) với con số cho dù toàn bộ chuỗi đã được tiêu thụ hay xác thực nó bằng một biểu thức chính quy trước khi phân tích cú pháp. Dưới đây là phiên bản sẽ kiểm tra xem toàn bộ chuỗi đã được phân tích cú pháp chưa, và không chỉ là các ký tự đầu tiên:

public static boolean isThisDateValid(String dateToValidate, String dateFormat) { 
    if (dateToValidate == null) { 
     return false; 
    } 

    SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); 
    sdf.setLenient(false); 

    ParsePosition position = new ParsePosition(0); 
    Date date = sdf.parse(dateToValidate, position); 
    return date != null && position.getIndex() == dateToValidate.length(); 
} 
Các vấn đề liên quan