我怎么知道某个月的所有星期二?

时间:2009-09-23 23:49:39

标签: java

例如在9月我需要:

1,8,15,22和29

由于

4 个答案:

答案 0 :(得分:7)

查找Doomsday Rule - 您应该可以将该算法应用于您的问题。

答案 1 :(得分:4)

我能看到的最简单(天真)的解决方案是:

获取日历(Calendar.getInstance())

设置年,月,日等等(其他字段为零)。

然后迭代添加一个日期(如果你没有在正确的月份停止 - calendar.get(Calendar.MONTH))

迭代时,如果calendar.get(Calendar.DAY_OF_WEEK)== Calendar.TUESDAY则递增星期二计数器。

答案 2 :(得分:1)

根据daveb的回答,我得到了:

import java.util.Calendar;
import static  java.util.Calendar.*;

public class DiasDelMes {

    public static void main( String [] args ) {

        Calendar calendar = getInstance();

        calendar.set( DAY_OF_MONTH, 1  );

        int month = calendar.get( MONTH );

        while( calendar.get( MONTH ) == month ) { 

            if( calendar.get( DAY_OF_WEEK ) == TUESDAY ) {
                 System.out.println( calendar.get( DAY_OF_MONTH ) ) ;
            }

            calendar.add( DAY_OF_MONTH , 1 ); 
       }
    }
} 

答案 3 :(得分:0)

我正在寻找这个问题的答案,但要在Java 8中解决它。

这是我的解决方案:

public Stream<Temporal> listAllDaysInMonthIterative(Month month, DayOfWeek dow) {
    List<Temporal> dates = new ArrayList<>();
    LocalDate date = LocalDate.of(Year.now().getValue(), month.getValue(), 1);

    TemporalAdjuster adjuster = TemporalAdjusters.nextOrSame(dow);

    while (date.with(adjuster).get(ChronoField.MONTH_OF_YEAR) == month.getValue()) {
        date = date.with(adjuster);
        dates.add(date);
        adjuster = TemporalAdjusters.next(dow);
    }

    return dates.stream();
}

执行命令

@Test
public void testMondaysInMonth() {

    MonthLengthReporter reporter = new MonthLengthReporter();
    Stream days = reporter.listAllDaysInMonthIterative(Month.MARCH, DayOfWeek.MONDAY);

    days.forEach(System.out::println);

}