2010-07-17 42 views

Trả lời

17

Đây là một phiên bản thô với ý kiến ​​mô tả các bước sau:

// create a Calendar for the 1st of the required month 
int year = 2010; 
int month = Calendar.JANUARY; 
Calendar cal = new GregorianCalendar(year, month, 1); 
do { 
    // get the day of the week for the current day 
    int day = cal.get(Calendar.DAY_OF_WEEK); 
    // check if it is a Saturday or Sunday 
    if (day == Calendar.SATURDAY || day == Calendar.SUNDAY) { 
     // print the day - but you could add them to a list or whatever 
     System.out.println(cal.get(Calendar.DAY_OF_MONTH)); 
    } 
    // advance to the next day 
    cal.add(Calendar.DAY_OF_YEAR, 1); 
} while (cal.get(Calendar.MONTH) == month); 
// stop when we reach the start of the next month 
+0

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

+0

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

+0

Cảm ơn bạn rất nhiều mikej – usman

8

java.time

Bạn có thể sử dụng Java 8 streamjava.time package. Ở đây, một số IntStream từ 1 đến số ngày trong tháng đã cho được tạo. Luồng này được ánh xạ tới luồng LocalDate trong tháng cụ thể sau đó được lọc để giữ ngày thứ Bảy và Chủ nhật.

import java.time.DayOfWeek; 
import java.time.DayOfWeek; 
import java.time.LocalDate; 
import java.time.Month; 
import java.time.YearMonth; 
import java.util.stream.IntStream; 

class Stackoverflow{ 
    public static void main(String args[]){ 

     int year = 2010; 
     Month month = Month.JANUARY; 

     IntStream.rangeClosed(1,YearMonth.of(year, month).lengthOfMonth()) 
       .mapToObj(day -> LocalDate.of(year, month, day)) 
       .filter(date -> date.getDayOfWeek() == DayOfWeek.SATURDAY || 
           date.getDayOfWeek() == DayOfWeek.SUNDAY) 
       .forEach(date -> System.out.print(date.getDayOfMonth() + " ")); 
    } 
} 

Chúng tôi tìm thấy kết quả tương tự như câu trả lời đầu tiên (2 3 9 10 16 17 23 24 30 31).

1

Bạn có thể thử như thế này:

int year=2016; 
int month=10; 
calendar.set(year, 10- 1, 1); 
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
ArrayList<Date> sundays = new ArrayList<Date>();> 

for (int d = 1; d <= daysInMonth; d++) { 
     calendar.set(Calendar.DAY_OF_MONTH, d); 
     int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 
     if (dayOfWeek==Calendar.SUNDAY) { 
      calendar.add(Calendar.DATE, d); 
      sundays.add(calendar.getTime()); 
     } 
} 
+0

FYI, những lớp học thời gian ngày nổi tiếng rắc rối và khó hiểu cũ hiện nay là di sản, được thay thế bởi các lớp java.time. Tránh các lớp học cũ. –

+1

Vẫn có liên quan cho nhà phát triển Android. –

2

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.

Các vấn đề liên quan