公历问题

Issue with Gregorian Calendar

我们使用下面的代码片段来获取所提供月份和年份的天数。对于 02 和 2011,它 returns 天数为 31(事实并非如此)。对于 02 和 2016,returns 天数为 29.

任何线索。

package Processes.BSAInvoiceInquiry.ExternalCall.PaymentStatusInquiry;
import java.util.Calendar;
import java.util.GregorianCalendar;

public class PaymentStatusInquiryJavaCode {

    protected int year = 0;
    protected int month = 0;
    protected int days = 0;

    public void invoke() throws Exception {

        PaymentStatusInquiryJavaCode a = new PaymentStatusInquiryJavaCode();

        System.out.println("Year  " + year);
        System.out.println("Month  " + month);

        Calendar calObj = new GregorianCalendar();
        calObj.set(Calendar.YEAR, year);
        calObj.set(Calendar.MONTH, month - 1);
        System.out.println("Month  " + Calendar.MONTH);
        int numDays = calObj.getActualMaximum(Calendar.DAY_OF_MONTH);
        System.out.println("No of the days in the month is   " + numDays);
        days = numDays;

    }
}

完成 user6690200's 2016 年 returns 29 因为今天是 29 号,而 2016 年是闰年,是 2 月 29 日。 2011 年不是闰年,所以它实际上 returns 下个月(3 月有 31 天)的数字。

这只是 Calendar 的另一个意外行为,请参阅 this,您可以在创建后通过 clear 修复它:

Calendar calendar = new GregorianCalendar();
calendar.clear();
calendar.set(Calendar.YEAR, 2011);
calendar.set(Calendar.MONTH, 1);
System.out.println(calendar.getActualMaximum(calendar.DAY_OF_MONTH)); //28

应避免使用过时的Calendar。在 java8 中,可以通过以下方式完成:

YearMonth yearMonth = YearMonth.of(2011, 2);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth); //28

尝试

// month 1 based    
new Calendar.Builder().setDate(year, month-1, 1).build().getActualMaximum(DAY_OF_MONTH)

问题是none

calObj.set(DAY_OF_MONTH, 1);