0

如何计算一个月的星期二数?

使用calender.set我们可以设置特定月份,然后如何计算该月的星期一、星期二等的数量?

代码是:

public static void main(String[] args )
{
    Calendar calendar = Calendar.getInstance();
    int  month = calendar.MAY; 
    int year = 2012;
    int date = 1 ;

    calendar.set(year, month, date);

    int MaxDay = calendar.getActualMaximum(calendar.DAY_OF_MONTH);
    int mon=0;

    for(int i = 1 ; i < MaxDay ; i++)
    {        
        calendar.set(Calendar.DAY_OF_MONTH, i);
        if (calendar.get(Calendar.DAY_OF_WEEK) == calendar.MONDAY ) 
            mon++;      
    }

    System.out.println("days  : " + MaxDay);    
    System.out.println("MOndays  :" + mon);
}
4

4 回答 4

8

这里不写整个代码是一般的想法:

    Calendar c = Calendar.getInstance();
    c.set(Calendar.MONTH, Calendar.MAY); // may is just an example
    c.set(Calendar.YEAR, 2012);
    int th = 0;
    int maxDayInMonth = c.getMaximum(Calendar.MONTH);
    for (int d = 1;  d <= maxDayInMonth;  d++) {
        c.set(Calendar.DAY_OF_MONTH, d);
        int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);
        if (Calendar.THURSDAY == dayOfWeek) {
            th++;
        }
    }

此代码应计算星期四的数量。我相信你可以修改它来计算一周中所有天的数量。

显然这段代码效率不高。它会遍历该月的所有日子。您可以通过获取第一天的星期几、一个月的天数来优化它,并且(我相信)您可以编写代码来计算一周中每一天的数量,而无需遍历整个月。

于 2012-05-03T09:51:42.000 回答
3

使用 Java 8+,您可以以更简洁的方式编写它:

public static int countDayOccurenceInMonth(DayOfWeek dow, YearMonth month) {
  LocalDate start = month.atDay(1).with(TemporalAdjusters.nextOrSame(dow));
  return (int) ChronoUnit.WEEKS.between(start, month.atEndOfMonth()) + 1;
}

你可以打电话给:

int count = countDayOccurenceInMonth(DayOfWeek.TUESDAY, YearMonth.of(2012, 1));
System.out.println(count); //prints 5
于 2016-09-27T15:30:26.977 回答
0

AlexR 提到了更高效的版本。以为我会试一试:

private int getNumThursdays() {
    // create instance of Gregorian calendar 
    Calendar gc = new GregorianCalendar(TimeZone.getTimeZone("EST"), Locale.US);
    int currentWeekday = gc.get(Calendar.DAY_OF_WEEK);

    // get number of days left in month
    int daysLeft = gc.getActualMaximum(Calendar.DAY_OF_MONTH) - 
            gc.get(Calendar.DAY_OF_MONTH);

    // move to closest thursday (either today or ahead)
    while(currentWeekday != Calendar.THURSDAY) {
        if (currentWeekday < 7)  currentWeekday++;
        else currentWeekday = 1;
        daysLeft--;
    }

    // calculate the number of Thursdays left
    return daysLeft / 7 + 1;
}

注意:获取当前年、月、日等时,取决于您的环境。例如,如果有人手动将手机上的时间设置为错误,那么这个计算可能是错误的。为确保正确性,最好从可信来源提取有关当前月、年、日、时间的数据。

于 2014-02-13T19:22:45.037 回答
0

Java 日历实际上有一个内置属性Calendar.DAY_OF_WEEK_IN_MONTH

Calendar calendar = Calendar.getInstance(); //get instance
calendar.set(Calendar.DAY_OF_WEEK, 3);  //make it be a Tuesday (crucial)
//optionally set the month you want here
calendar.set(Calendar.MONTH, 4) //May
calendar.getActualMaximum(Calendar.DAY_OF_WEEK_IN_MONTH); //for this month (what you want)
calendar.getMaximum(Calendar.DAY_OF_WEEK_IN_MONTH); //for any month (not so useful)
于 2015-05-04T08:15:13.450 回答