2014-04-15 10 views
5

Tôi đang sử dụng mã được bao gồm ở đây để xác định liệu giá trị đã cho có là ngày hợp lệ hay không. Theo một trường hợp cụ thể, nó đánh giá địa chỉ đường phố sau:Java DateFormat.parse nghĩ rằng "100 112TH AVE NE" là một ngày

100 lần thứ 112 AVE NE

Rõ ràng không phải là một ngày, nhưng Java diễn giải nó như:

Sun Jan 12 00: 00:00 EST 100

Các mã trong câu hỏi:

String DATE_FORMAT = "yyyyMMdd"; 
try { 
    DateFormat dfyyyyMMdd = new SimpleDateFormat(DATE_FORMAT); 
    dfyyyyMMdd.setLenient(false); 
    Date formattedDate; 
    formattedDate = dfyyyyMMdd.parse(aValue); 
    console.debug(String.format("%s = %s","formattedDate",formattedDate)); 
} catch (ParseException e) { 
    // Not a date 
} 

Giao diện điều khiển lợi nhuận:

11: 41: 40,063 TestValues ​​DEBUG | formattedDate = Sun Jan 12 00:00:00 EST 100

Bất kỳ ý tưởng gì đang xảy ra ở đây?

+3

Vì vậy, tại sao bạn chuyển địa chỉ đến trình định dạng ngày ?? –

+2

(Có vẻ như tôi phân tích năm = 100, tháng = 1, ngày = 12, tức là tốt nhất có thể hy vọng.) –

+0

điều này thật buồn cười :-) [xin lỗi] – Leo

Trả lời

6

Phương thức parse không xác minh rằng toàn bộ chuỗi đã được sử dụng khi phân tích cú pháp; bạn có thể có rác ngẫu nhiên sau một ngày hợp lệ và mọi thứ hoạt động. Trong trường hợp này, có một chút ngạc nhiên rằng 100 112 có thể được phân tích thành công dưới dạng ngày, nhưng có thể.

Bạn có thể cung cấp ParsePosition để xác minh rằng toàn bộ chuỗi đã được sử dụng khi phân tích cú pháp.

ParsePosition pos = new ParsePosition(0); 
dfyyyyMMdd.parse(aValue, pos); 
if (pos.getIndex() != aValue.length()) { 
    // there's garbage at the end 
} 
+2

Tất nhiên, người ta có thể chắc chắn rằng "dư thừa" không đơn giản là khoảng trắng. –

+0

Tôi cũng phải kiểm tra xem mỗi chuỗi có trống không. Khi 'pos == 0' và chuỗi rỗng,' pos.getIndex == aValue.length() == 0'. – bobanahalf

+0

@Joni, tôi đã chạy thử nghiệm với điều này và ParsePosition có vẻ hiệu quả hơn nhiều. Bài kiểm tra đã phân tích cú pháp 3 triệu giá trị, một số ngày hợp lệ, một số lỗi. Kết quả theo nano giây: 'joda.parseDateTime == 16,480,274,565; dateTime.parse == 18,584,338,145; dateTime.parse + pos == 2,292,225,286'. Tôi không thể tìm thấy một tương đương với ParsePosition trong joda. – bobanahalf

3

Theo documentation, phương pháp phân tích cú pháp có thể KHÔNG sử dụng toàn bộ văn bản của chuỗi -

public Date parse(String source) 
       throws ParseException 

    Parses text from the beginning of the given string to produce a date. 
    The method may not use the entire text of the given string. 

Tôi đã kiểm tra source code cho SimpleDateFormat và thấy rằng nó là phân tích chuỗi chỉ lên với chiều dài của compiledPattern.

Như vậy, chuỗi có dạng -

yyyyMMdd(followed by anything) 

sẽ được phân tích mà không cần bất kỳ lỗi nào.

Vì vậy, ví dụ: nó cũng phân tích cú pháp -

"10000514blabla" --> Tue May 14 00:00:00 EST 1000 
"100 112"  --> Sun Jan 12 00:00:00 EST 100 
"1 112xyz"  --> Wed Jan 12 00:00:00 EST 1 
Các vấn đề liên quan