tl; dr
Sử dụng chế độ nghiêm ngặt bật java.time.DateTimeFormatter
để phân tích cú pháp a LocalDate
. Bẫy cho DateTimeParseException
.
LocalDate.parse(
"31/02/2000" ,
DateTimeFormatter
.ofPattern ( "dd/MM/uuuu" )
.withResolverStyle ( ResolverStyle.STRICT )
)
Sau khi phân tích cú pháp, bạn có thể kiểm tra giá trị hợp lý. Ví dụ, ngày sinh trong vòng một trăm năm qua.
birthDate.isAfter( LocalDate.now().minusYears( 100 ) )
Tránh các lớp ngày-giờ kế thừa
Tránh sử dụng các lớp date-time cũ rắc rối được vận chuyển cùng với các phiên bản Java sớm nhất. Bây giờ được thay thế bởi các lớp java.time .
LocalDate
& DateTimeFormatter
&ResolverStyle
Các LocalDate
lớp đại diện cho một giá trị ngày tháng chỉ mà không cần thời gian của ngày và không có múi giờ.
String input = "31/02/2000";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "dd/MM/uuuu" );
try {
LocalDate ld = LocalDate.parse ( input , f );
System.out.println ( "ld: " + ld );
} catch ( DateTimeParseException e ) {
System.out.println ( "ERROR: " + e );
}
Các java.time.DateTimeFormatter
lớp có thể được thiết lập để phân tích chuỗi với bất kỳ ba chế độ khoan dung quy định tại các ResolverStyle
enum. Chúng tôi chèn một dòng vào đoạn mã trên để thử từng chế độ.
f = f.withResolverStyle ( ResolverStyle.LENIENT );
Kết quả:
ResolverStyle.LENIENT
ld: 2000-03-02
ResolverStyle.SMART
ld: 2000-02-29
ResolverStyle.STRICT
LỖI: java.time.format.DateTimeParseException: Không thể phân tích cú pháp văn bản '31 / 02/2000 ': Ngày không hợp lệ' NGÀY 31 THÁNG 2 '
Chúng ta có thể thấy rằng trong ResolverStyle.LENIENT
chế độ này, ngày không hợp lệ được chuyển về phía trước một số ngày tương đương. Ở ResolverStyle.SMART
chế độ (mặc định), một quyết định hợp lý được đưa ra để giữ ngày trong tháng và đi với ngày cuối cùng có thể của tháng, ngày 29 tháng 2 trong năm nhuận, vì không có ngày thứ 31 trong tháng đó. Các ResolverStyle.STRICT
chế độ ném một ngoại lệ phàn nàn rằng không có ngày đó.
Cả ba điều này đều hợp lý tùy thuộc vào vấn đề kinh doanh và chính sách của bạn. Có vẻ như trong trường hợp của bạn, bạn muốn chế độ nghiêm ngặt từ chối ngày không hợp lệ hơn là điều chỉnh nó.
Giới thiệu về java.time
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của mình. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*
lớp.
Lấy các lớp java.time ở đâu?
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .