Java — Làm Thế Nào Để So Sánh Ngày Trong Java?
tl; dr
LocalDate today = chúng tôi ZoneId.of( "America/Montreal" ) ) ; Boolean isBetween = ( ! today.isBefore( localDate1 ) ) // “not-before” is short for “is-equal-to or later-than”. && today.isBefore( localDate3 ) ;
Hoặc, tốt hơn, nếu bạn thêm thư viện ThreeTen-Extra vào dự án của bạn.
LocalDateRange.of( chúng tôi … ) , chúng tôi … ) ).contains( LocalDate.now() )
Cách tiếp cận nửa mở, trong đó bắt đầu là bao gồm trong khi kết thúc là độc quyền.
Lựa chọn không đúng định dạng
Nhân tiện, đó là một lựa chọn xấu về định dạng cho biểu diễn văn bản của giá trị ngày hoặc thời gian. Bất cứ khi nào có thể, hãy sử dụng các định dạng ISO 8601 . Các định dạng ISO 8601 không rõ ràng, dễ hiểu trên các nền văn hóa của con người và dễ dàng phân tích bằng máy.
Đối với giá trị chỉ có ngày, định dạng chu 7849;n là YYYY-MM-DD. Lưu ý cách định dạng này có lợi ích theo trình tự thời gian khi được sắp xếp theo thứ tự abc.
LocalDate
LocalDate
class biểu thị giá trị chỉ theo ngày mà không có thời gian trong ngày và không có múi giờ.
Một múi giờ là rất quan trọng trong việc xác định một ngày. Đối với bất kỳ thời điểm nào, ngày thay đổi trên toàn cầu theo khu vực. Ví dụ, một vài phút sau nửa đêm ở Paris Pháp là một ngày mới trong khi ngày hôm qua vẫn còn ở Montréal Québec .
ZoneId z = chúng tôi "America/Montreal" ); LocalDate today = chúng tôi z );
DateTimeFormatter
Vì các chuỗi đầu vào của bạn là định dạng không chuẩn, chúng tôi phải xác định một mẫu định dạng cho phù hợp.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
Sử dụng để phân tích các chuỗi đầu vào.
LocalDate start = LocalDate.parse( "22-02-2010" , f ); LocalDate stop = LocalDate.parse( "25-12-2010" , f );
Trong công việc thời gian, thường là tốt nhất để xác định một khoảng thời gian theo cách tiếp cận Nửa mở trong đó bắt đầu là bao gồm trong khi kết thúc là độc quyền. Vì vậy, chúng tôi muốn biết nếu hôm nay là như vậy hay muộn hơn so với bắt đầu và cũng trước khi dừng lại. Một cách nói hay hơn về cách nói là giống nhau hoặc muộn hơn so với khởi đầu, đó là trước khi bắt đầu.
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;
Xem Trả lời theo gstackoverflow hiển thị danh sách các phương thức so sánh bạn có thể gọi.
Giới thiệu về Java.time
Java.time framework được tích hợp vào Java 8 trở lên. Các lớp này thay thế các lớp cũ di sản ngày-thời gian rắc rối như Java.util.Date
, Calendar
, & SimpleDateFormat
.
Joda-Time dự án, hiện ở chế độ bảo trì , khuyên di chuyển đến các lớp chúng tôi .
Để 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 .
Nơi để có được các lớp Java.time?
ThreeTen-Extra dự án mở rộng chúng tôi với các lớp bổ sung. Dự án này là một nền tảng 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ố lớp hữu ích ở đây, chẳng hạn như Interval
, YearWeek
, YearQuarter
, và more .
CẬP NHẬT: Phần này của Joda-Time Thời gian bên dưới được giữ nguyên như lịch sử. Joda-Time dự án, hiện ở chế độ bảo trì , khuyên di chuyển đến các lớp chúng tôi .
Các câu trả lời khác là chính xác đối với các lớp chúng tôi và Java.util.CalWiki đi kèm. Nhưng những lớp học nổi tiếng là rắc rối. Vì vậy, đây là một số mã ví dụ sử dụng thư viện Joda-Time 2.3.
Nếu bạn thực sự muốn một ngày không có bất kỳ phần thời gian nào và không có múi giờ, thì hãy sử dụng LocalDate
class trong Joda-Time. Lớp đó cung cấp các phương thức so sánh bao gồm compareTo
(được sử dụng với Trình so sánh Java ), isBefore
, isAfter
và isEqual< /code>.
Đầu vào
String string1 = "22-02-2010"; String string2 = "07-04-2010"; String string3 = "25-12-2010";
Xác định một định dạng mô tả các chuỗi đầu vào
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );
Sử dụng trình định dạng để phân tích các chuỗi thành các đối tượng LocalDate
LocalDate localDate1 = formatter.parseLocalDate( string1 ); LocalDate localDate2 = formatter.parseLocalDate( string2 ); LocalDate localDate3 = formatter.parseLocalDate( string3 ); boolean is1After2 = localDate1.isAfter( localDate2 ); boolean is2Before3 = localDate2.isBefore( localDate3 );
Kết xuất giao diện điều khiển
System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 ); System.out.println( "is1After2 " + is1After2 ); System.out.println( "is2Before3 " + is2Before3 );
Khi chạy đào
Dates: 2010-02-22 2010-04-07 2010-12-25 is1After2 false is2Before3 true
Vì vậy, hãy xem nếu cái thứ hai nằm giữa hai cái kia (độc quyền, nghĩa là không bằng một trong hai điểm cuối)
boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );
Làm việc với các khoảng thời gian
Nếu bạn đang làm việc với các khoảng thời gian, tôi khuyên bạn nên khám phá trong Joda-Time các lớp: Thời lượng , Khoảng thời gian , và Thời gian . Các phương thức như overlap
và contains
giúp việc so sánh trở nên dễ dàng.
Để thể hiện văn bản, hãy xem tiêu chuẩn ISO 8601:
- thời lượng
[.__.] Định dạng: PnYnMnDTnHnMnS
[.__.] Ví dụ: P3Y6M4DT12H30M5S
[.__.] (Có nghĩa là Ba năm, sáu tháng, bốn ngày, mười hai giờ, ba mươi phút và năm giây Hồi) - khoảng[.__.] Định dạng: bắt đầu/kết thúc
[.__.] Ví dụ: 2007-03-01T13: 00: 00Z/2008-05-11T15: 30: 00Z
Các lớp Joda-Time có thể làm việc với các chuỗi ở cả hai định dạng đó, cả dưới dạng đầu vào (phân tích cú pháp) và đầu ra (tạo chuỗi).
Joda-Time thực hiện so sánh bằng cách sử dụngtrong đó phần đầu của nhịp là bao gồm trong khi kết thúc là độc quyền. Cách tiếp cận này là một cách khôn ngoan để xử lý các khoảng thời gian. Tìm kiếm StackOverflow để biết thêm.