2014-09-29 14 views
5

Tôi có hai chuỗi định dạng để phân tích cú pháp ngày: "yyyy-MM-dd" & "dd-MM-yyyy "và tôi đã hy vọng rằng lớp FastDateFormat sẽ có thể phân biệt giữa hai lớp để cho một người sẽ thông qua một ParseException và người kia sẽ làm việc. Tuy nhiên cả hai định dạng phân tích các giá trị chuỗi giống nhau, trong đó một định dạng rõ ràng được phân tích cú pháp chính xác và các định dạng khác thì không.Cách ngăn mẫu FastDateFormat "yyyy-MM-dd" phân tích cú pháp Chuỗi theo định dạng "dd-MM-yyyy"

mã kiểm tra của tôi cho thấy:

Parsed: "2014-06-06" into Fri Jun 06 00:00:00 EDT 2014 using "yyyy-MM-dd" 
Parsed: "2014-06-06" into Sat Dec 05 00:00:00 EST 11 using "dd-MM-yyyy" 
Parsed: "06-06-2014" into Sat Dec 05 00:00:00 EST 11 using "yyyy-MM-dd" 
Parsed: "06-06-2014" into Fri Jun 06 00:00:00 EDT 2014 using "dd-MM-yyyy" 

Có cách nào dễ dàng để làm FastDateFormat xử lý năm 4 chữ số đúng dựa trên mô hình " Tôi không thấy bất kỳ cài đặt nhân hậu trên FastDateFormat

?.
+0

Tôi nghĩ bạn cũng cần gắn thẻ câu hỏi này vào một câu hỏi khác. Không thể tìm thấy nó trong 'Java'. – Tirath

Trả lời

3

Tôi có thể sao chép kết quả của bạn với Apache-Common-Lang-library.Có vẻ như API không cung cấp bất kỳ giải pháp chính thức nào, cũng không có trong phiên bản mới nhất v3.3.2.Thông thường một trình phân tích cú pháp tốt sẽ từ chối đầu vào 2014-06-06 cho mẫu dd-MM- yyyy bằng cách ném một ngoại lệ nhưng ở đây FastDateFormat chấp nhận nó và thậm chí không thể được đặt sang chế độ không khoan dung như SimpleDateFormat.

Vì vậy, lựa chọn duy nhất còn lại là:

a) Do hack của bạn riêng (tương tự như sau ví dụ code):

public class ParserDDMMYYYY extends FastDateFormat { 
    public static final INSTANCE = 
    new ParserDDMMYYYY("dd-MM-yyyy", TimeZone.getDefault(), Locale.getDefault()); 

    @Override 
    public Date parse(String input) throws ParseException { 
    if (input.charAt(4) == '-') { 
     throw new ParseException("Invalid format: " + input, 0); 
    } 
    return super.parse(input); 
    } 

    // ... more overrides of similar parse methods 
} 

Trường hợp của việc ngăn ngừa dd-MM-yyyy cho mô hình yyyy-MM-dd rất giống nhau.

b) Hoặc bạn thay đổi thư viện ngày giờ vì có ít nhất ba thư viện tốt hơn để xử lý và định dạng ngày giờ. Hãy nhớ rằng thư viện apache vẫn dựa trên các gói java.util.* cũ và java.text.*.

Tôi cũng nghi ngờ nếu lớp học FastDateFormat thực sự tốt hơn rất nhiều về hiệu suất, chắc chắn không tốt hơn so với các phiên bản bất biến của các thư viện ngày giờ khác. Ví dụ tôi đã thấy một số từ khóa đồng bộ trong thư viện apache (cạnh tranh khóa tiềm năng, không quá hiện đại).

+0

Bạn sẽ đề xuất "thư viện tốt hơn" nào khác và tôi sẽ kiểm tra chúng. Cảm ơn. –

+1

@AwkOmo Hai thư viện phổ biến và phổ biến nhất là JSR-310 (được xây dựng trong gói java.time trong Java-8) và Joda-Time. Thư viện của riêng tôi Time4J là không rõ, nhưng cũng cung cấp các loại và định dạng bất biến. Tất cả ba thư viện cung cấp nhiều tùy chọn cấu hình hơn để định dạng và phân tích cú pháp hơn 'FastDateFormat', ví dụ như phân tích cú pháp nghiêm ngặt. Chúc may mắn. –

0

Giải pháp của tôi là định dạng được phân tích cú pháp Date và so sánh String với ảnh gốc. Điều này là chung chung hơn kiểm tra nếu một nhân vật cụ thể là ở một vị trí cụ thể, nhưng nó cũng chậm hơn. Nó cho phép bạn cho phép người dùng định cấu hình định dạng.

private final FastDateFormat myDateFormat = FastDateFormat.getInstance("dd-MM-yyyy"); 

public Date parseDate(String dateString) throws ParseException { 
    final Date parsedDate = myDateFormat.parse(dateString); 
    if(dateString != timeRangeDateFormat.format(parsedDate)){ 
     throw new ParseException("Strict mode engaged", 0); 
    } 
}   
Các vấn đề liên quan