【问题标题】:Issue with Gregorian Calendar [duplicate]公历问题[重复]
【发布时间】:2018-04-29 10:57:36
【问题描述】:

我们使用下面的代码 sn-p 来获取提供的月份和年份的天数。对于 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;

    }
}

【问题讨论】:

  • 对于 02 和 2011,它返回天数为 31(不是这种情况)。
  • 您绝对应该查看 Java 8 的 java.time 包。坚如磐石的舒适不可变工具。
  • @DreamspacePresident 我们的工具仍然依赖于 java 1.7
  • 没什么大问题@AbdulKader。 java.time 已向后移植到 Java 6 和 7。获取 ThreeTen Backport,将其添加到您的项目中并开始使用现代 Java 日期和时间 API。享受!鉴于您在使用老式 Calendar 课程时遇到的麻烦,这将是一个很大的解脱。
  • @AbdulKader 我写了a new answer to the linked question。 “如果您只需要计算某个月的天数……”这一段适合您。请看一看。

标签: java gregorian-calendar


【解决方案1】:

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

【讨论】:

  • @user66902200 没有帮助,同样的问题
  • @AbdulKader 然后请发布您的测试代码。答案中的测试代码运行良好。
【解决方案2】:

要完成 user6690200answer,它会返回 29 表示 2016 年,因为今天是 29 日,而 2016 年是闰年,并且是 2 月 29 日。 2011 年不是闰年,所以它实际上返回下个月的数字(三月有 31 天)。

【讨论】:

  • 理想情况下不应该是 28
  • 不知道,他们是这样实现的。
【解决方案3】:

试试

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

没有问题

calObj.set(DAY_OF_MONTH, 1);

【讨论】:

  • DAY_OF_MONTH 是从 1 开始,0 天是减去一天
  • 2011:2-1:0 是 2011:1:31 然后是 31, 2016:2-1:0 是 2016:1:29 然后是 29
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多