格里高利历的问题

时间:2018-04-29 10:57:36

标签: java gregorian-calendar

我们使用以下代码段来获取所提供的月份和年份的天数。对于02和2011,它返回天数为31(事实并非如此)。对于02和2016,它返回天数为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;

    }
}

3 个答案:

答案 0 :(得分:3)

这只是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

答案 1 :(得分:2)

要完成user6690200 answer,它将在2016年返回29,因为它是今天的第29届,2016年是闰年,并且在2月29日。 2011年不是闰年所以它实际上返回了下个月的数字(3月有31天)。

答案 2 :(得分:0)

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

问题是没有

calObj.set(DAY_OF_MONTH, 1);