Sử dụng java.time
Dự án Joda-Time hiện đang ở maintenance mode, với đội ngũ tư vấn chuyển đổi sang các java.time lớp. Xem Tutorial by Oracle.
Lớp LocalDate
đại diện cho giá trị chỉ có ngày không có thời gian trong ngày và không có múi giờ.
LocalDate start = LocalDate.of(2017 , Month.JANUARY , 23) ;
LocalDate stop = LocalDate.of(2017 , Month.FEBRUARY , 2) ;
Nhân tiện, bạn có thể muốn thêm kiểm tra tính xác thực để xác minh rằng kết thúc không phải trước khi bắt đầu.
Không sau
Tôi tin rằng logic bạn đang tìm kiếm, bao gồm ngày kết thúc, là "không sau". Lớp LocalDate
bao gồm phương thức isAfter
, mà bạn có thể thêm “NOT” (!
) hợp lý.
Ngoài ra, vòng lặp while
có vẻ thích hợp và tự giải thích trong trường hợp này hơn vòng lặp for
.
LocalDate ld = start ;
List<LocalDate> dates = new ArrayList<>() ;
while (! ld.isAfter(stop)) {
dates.add(ld); // Collect this date.
ld = ld.plusDays(1) ; // Setup the next loop.
}
Xem code run live at IdeOne.com này.
ngày: [2017-01-23, 2017-01-24, 2017-01-25, 2017-01-26, 2017-01-27, 2017-01-28, 2017-01-29 , 2017/01/30, 2017/01/31, 2017/02/01, 2017/02/02]
nửa mở
lặp dừng lại khi currentDate đạt một ngày trước ENDDATE
Điều này thực sự mong muốn. Được gọi là Nửa mở, phương pháp phổ biến trong xử lý ngày giờ là xem xét sự bắt đầu là bao gồm trong khi kết thúc là độc quyền. Vì vậy, giờ nghỉ trưa bắt đầu lúc 12:00:00 (trưa) và chạy đến, nhưng không bao gồm, 13:00:00 (1 giờ chiều). Tháng 1 bắt đầu vào ngày 1 tháng 1 và chạy đến, nhưng không bao gồm, ngày 1 tháng Hai. Một tuần bắt đầu vào Thứ Hai và chạy đến, nhưng không bao gồm Thứ Hai sau. Theo cách hữu ích nhất, cách tiếp cận này tránh được vấn đề xác định lần tách thứ hai cuối cùng của một ngày mà một số hệ thống sử dụng mili giây (x.999), một số (x.999999), cùng nano giây (x.999999999) và một số khác sử dụng các biến thể như vậy như 5 chữ số thập phân (x.99999). Thay vào đó chúng tôi đi đến, nhưng không bao gồm, thời điểm đầu tiên của giờ hoặc ngày tiếp theo, v.v.
Tôi thấy rằng sử dụng phương pháp Half-Open một cách nhất quán trong suốt mã của tôi làm cho mã dễ đọc hơn, dễ hiểu hơn ít có khả năng dẫn đến lỗi off-by-one. Tôi đã bị bắt trong vô số vấn đề bí ẩn tài chính mà hóa ra là sự nhầm lẫn hoặc hiểu lầm về một báo cáo bao gồm ngày cho với ngày tháng độc quyền bao gồm. Vì vậy, nếu có thể, hãy đào tạo người dùng của bạn để nghĩ cách nửa mở một cách nhất quán. Nếu không khả thi, sau đó điều chỉnh mã của bạn để logic và vòng lặp của bạn đang sử dụng Half-Open trong nội bộ ít nhất.
Đây là mã tương tự như trên, nhưng sử dụng isBefore
hơn NOT isAfter
, sử dụng cách tiếp cận Half-Open. Kết thúc là ngày 3 tháng 2 thay vì ngày 2 tháng 2.
LocalDate start = LocalDate.of(2017 , Month.JANUARY , 23) ;
LocalDate stop = LocalDate.of(2017 , Month.FEBRUARY , 3) ; // Third instead of the Second of February, to be half-open.
LocalDate ld = start ;
List<LocalDate> dates = new ArrayList<>() ;
while (ld.isBefore(stop)) { // Using "isBefore" for Half-Open approach.
dates.add(ld); // Collect this date.
ld = ld.plusDays(1) ; // Setup the next loop.
}
Xem này code run live at IdeOne.com.
bắt đầu: 2017-01-23 | ngừng: 2017-02-03
ngày: [2017-01-23, 2017-01-24, 2017-01-25, 2017-01-26, 2017-01-27, 2017-01-28, 2017/01/29, 2017/01/30, 2017/01/31, 2017/02/01, 2017/02/02]
Về java.time
khung java.time được xây dựng trong Java 8 trở lên. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date
, Calendar
, & SimpleDateFormat
.
Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển đến các lớp java.time.
Để tìm hiểu thêm, hãy xem Oracle Tutorial. 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 lấy các lớp java.time?
Dự án mở rộng ThreeTen-Extra java.time 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 vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval
, YearWeek
, YearQuarter
và more.
'!currentDate.isAfter (endDate) 'ngắn hơn' currentdate.isBefore (endDate) || currentdate.isEqual (endDate) '. Nói cách khác, sử dụng “KHÔNG lớn hơn” như một phiên bản ngắn hơn “nhỏ hơn hoặc bằng”. Xem [Câu trả lời của tôi] (https://stackoverflow.com/a/44320192/642706) để có ví dụ hoàn chỉnh. Và bây giờ tôi thấy [câu trả lời này] (https://stackoverflow.com/a/44316083/642706) có cùng ý tưởng, nhưng trong vòng lặp 'for' so với vòng lặp' while' của tôi. –