Lời khuyên của tôi là luôn luôn biến mất. Tôi không thể nghĩ về một trường hợp mà bạn muốn khoan dung, và cài đặt này sẽ không bao giờ được mặc định cho các lớp như SimpleDateFormat. Khả năng xử lý dữ liệu có thể giải thích rác là các chuỗi thời gian hợp lệ và mở ra các lỗi có thể khó khăn trong việc kiểm tra. Ngoài ra, nếu bạn đang sử dụng khoan dung để chịu đựng các biến thể trong định dạng thời gian bạn sẽ bị đốt cháy. Ví dụ:
System.out.println(new SimpleDateFormat("yyyyMMdd").parse("2010-12-30"));
sản lượng này (múi giờ của bạn có thể thay đổi):
Mon Nov 02 00:00:00 EST 2009
kết quả vô lý này dường như là trừ một tháng ("-1"), ngày thứ hai ("2- ") của năm 2010. Tháng zeroth là tháng mười hai!
Thật không may, việc sử dụng setLenient (false) không dẫn đến việc diễn giải nghiêm ngặt mẫu. SimpleDateFormat sẽ chịu đựng rác sau các mô hình phù hợp, như đã thảo luận ở đây:
SimpleDateFormat.parse() ignores the number of characters in pattern
Ngoài ra, nó không phải là nghiêm ngặt về số lượng các nhân vật mô hình, chẳng hạn như "d" thay vì "đ":
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/d");
sdf.setLenient(false);
System.out.println("For 5: " + sdf.parse("2010/01/5"));
System.out.println("For 05: " + sdf.parse("2010/01/05"));
System.out.println("For 15: " + sdf.parse("2010/01/15"));
Sản lượng:
For 5: Tue Jan 05 00:00:00 EST 2010
For 05: Tue Jan 05 00:00:00 EST 2010
For 15: Fri Jan 15 00:00:00 EST 2010
Ngoài ra với setLenient (false) "2010/01/05" được chấp nhận với mô hình "yyyy/MM/dd". Và sự bất đồng dữ liệu bị bỏ qua, như "1999/2011" với mẫu "yyyy/yyyy" (câu trả lời là 2011).
Sử dụng SimpleDateFormat để xác thực chuỗi ngày/giờ đáng buồn là không đáng tin cậy. Nếu bạn làm theo các liên kết ở trên, bạn sẽ thấy một số giải pháp, bao gồm một phiên bản chặt chẽ của SimpleDateFormat được viết bởi tôi!
FYI, 'DateFormat' là một trong những lớp học ngày thời gian cũ phiền hà mà bây giờ là di sản, thay thế bằng các lớp java.time. Sử dụng ['java.time.format.DateTimeFormatter'] (https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html). –