如何使用Java Calendar获取特定月份的天数?

时间:2015-03-28 07:21:16

标签: java calendar

我正在创建一个简单的程序,允许用户查看他们设置的月份之间的天数。

例如从1月到3月

我可以使用这个来获得当月的当天:

Calendar.DAY_OF_MONTH

我想要的是如何在月内提供价值?

我有这个简单的代码:

public static void machineProblemTwo(int startMonth, int endMonth) {

        int[] month = new int[0];
        int date = 2015;

        for(int x = startMonth; x <= endMonth; x++) {
           System.out.println(x + " : " + getMaxDaysInMonth(x,date));
        }

    }

public static int getMaxDaysInMonth(int month, int year){

        Calendar cal = Calendar.getInstance();
        int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH); // how can I supply the month here?

        return days;

    }

我该怎么做?你能帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:8)

在要求最大值之前,您需要在该年份和月份中将日历设置为 ,例如与

cal.set(year, month, 1);

(或根据David的回答使用日历构造函数。)

所以:

public static int getMaxDaysInMonth(int month, int year) {
    Calendar cal = Calendar.getInstance();
    // Note: 0-based months
    cal.set(year, month, 1);
    return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
}

或者 - 并且最好 - 使用Joda Time或Java 8:

// Java 8: 1-based months
return new LocalDate(year, month, 1).lengthOfMonth();

// Joda Time: 1-based months
return new LocalDate(year, month, 1).dayOfMonth().getMaximumValue();

(我确定Joda Time必须有一个更简单的选项,但我还没有找到它......)

答案 1 :(得分:6)

使用GregorianCalendar的构造函数来传递年,月和日。不要忘记月份从0到11(1月为0,12月为11)。

public static int numberOfDaysInMonth(int month, int year) {
    Calendar monthStart = new GregorianCalendar(year, month, 1);
    return monthStart.getActualMaximum(Calendar.DAY_OF_MONTH);
}

答案 2 :(得分:0)

我们也可以这样做:

private DateTime getNewDate(DateTime date, int dayOfMonth) {
    // first we need to make it 1st day of the month
    DateTime newDateTime = new DateTime(date.getYear(), date.getMonthOfYear(), 1, 0, 0);
    int maximumValueOfDays = newDateTime.dayOfMonth().getMaximumValue();

    // to handle the month which has less than 31 days
    if (dayOfMonth > maximumValueOfDays) {
      newDateTime = newDateTime.dayOfMonth().withMaximumValue();
    } else {
      newDateTime = newDateTime.withDayOfMonth(dayOfMonth);
    }
    return newDateTime;
  }