Các Answer by Lokni dường như là đúng, với điểm thưởng cho việc sử dụng Streams.
EnumSet
Đề nghị của tôi để cải thiện: EnumSet
. Lớp này là một triển khai cực kỳ hiệu quả của Set
. Được biểu diễn trong nội bộ dưới dạng các bit bit, chúng nhanh chóng thực hiện và chiếm rất ít bộ nhớ.
Sử dụng EnumSet
cho phép bạn soft-code định nghĩa của ngày cuối tuần bằng cách đi qua số Set<DayOfWeek>
.
Set<DayOfWeek> dows = EnumSet.of(DayOfWeek.SATURDAY , DayOfWeek.SUNDAY);
Trình diễn sử dụng cú pháp kiểu cũ không có Luồng. Bạn có thể điều chỉnh Lokni’s answer’s code để sử dụng EnumSet
theo cách tương tự.
YearMonth ym = YearMonth.of(2016 , Month.JANUARY) ;
int initialCapacity = ((ym.lengthOfMonth()/7) + 1) * dows.size() ; // Maximum possible weeks * number of days per week.
List<LocalDate> dates = new ArrayList<>( initialCapacity );
for (int dayOfMonth = 1; dayOfMonth <= ym.lengthOfMonth() ; dayOfMonth ++) {
LocalDate ld = ym.atDay(dayOfMonth) ;
DayOfWeek dow = ld.getDayOfWeek() ;
if(dows.contains(dow)) {
// Is this date *is* one of the days we care about, collect it.
dates.add(ld);
}
}
TemporalAdjuster
Bạn cũng có thể tận dụng các giao diện TemporalAdjuster
cung cấp cho các lớp học mà thao tác các giá trị ngày thời gian. Lớp TemporalAdjusters
(lưu ý số nhiều s
) cung cấp một số triển khai tiện dụng.
Dự án ThreeTen-Extra cung cấp các lớp làm việc với java.time. Điều này bao gồm triển khai TemporalAdjuster
, Temporals.nextWorkingDay()
.
Bạn có thể viết triển khai của riêng mình để thực hiện điều ngược lại, điều chỉnh thời gian nextWeekendDay
.
Nguồn
2016-10-07 20:34:57
mẫu không hoạt động bình thường, nó cung cấp đầu ra: 2,3,9,10,16,17,23,24,30, nhưng cho tháng 1 năm 2010 danh sách cuối tuần là 2,3,9,10,16,17, 23,24,30,31. xin vui lòng cho tôi biết đâu là pro – usman
Có một lỗi trong điều kiện 'while' trong đó ngày cuối cùng của tháng bị bỏ qua. Tôi đã sửa nó ngay bây giờ. – mikej
Cảm ơn bạn rất nhiều mikej – usman