用于获取一个月的最后一天的代码中的逻辑错误

logic error in the code used for get the last day of a month

我需要编写一个代码,输入一个名为 mese 的整数(这个整数从 0 到 5),这个整数将被添加到当前月份,因为当我需要获取确切月份的最后一天 例如,现在是八月,我需要知道八月的最后一天 + mese,其中 mese =3 所以我需要知道 8 月 +3 = 11 月的最后一天,所以在这种情况下函数将 return 30。 这是我的代码,但我不明白哪里出了问题(请注意,这只是我真实代码的一部分)

public int getmax(int mese){
    int res =0;
    int giornocorr = Calendar.getInstance().get(Calendar.DATE);
    int mesecorr = Calendar.getInstance().get(Calendar.MONTH);
    int annocorr = Calendar.getInstance().get(Calendar.YEAR);
if ((mesecorr + 1) - mese == 0) {
        // se siamo nel mese corrente
        giornoFineMese = Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
        res = giornoFineMese - giornocorr;
        System.out.println("days of this month: " + res);
    } else {
        // se non siamo nel mese corrente
        Calendar c = Calendar.getInstance();
        if ((mesecorr + 1 + mese) % 13 >= mesecorr) {// current year
            c.set(Calendar.MONTH, mesecorr + 1 + mese);
            c.set(Calendar.YEAR, annocorr);
        } else {// next year
            c.set(Calendar.MONTH, mesecorr + 1 + mese);
            c.set(Calendar.YEAR, annocorr + 1);
        }
        c.add(Calendar.MONTH, mese);
        c.set(Calendar.DATE, c.getMaximum(Calendar.DATE));
        res = c.getActualMaximum(Calendar.DATE);
        System.out.println("days of month " +c.get(Calendar.MONTH)+" "+ res);
        return res;
    }

感谢所有回答的人

您可以使用 YearMonth。请测试:

import java.time.*;

public class NumDays {
    public static void main(String[] args) {
        try {
            ZonedDateTime zdt = ZonedDateTime.now();
            // TEST LEAP YEAR
            zdt = zdt.plusYears(2);
            System.out.printf("Is %s a leap year? %b%n", zdt, Year.isLeap(zdt.getYear()));
            YearMonth startMonth = YearMonth.of(zdt.getYear(), Integer.parseInt(args[0]));
            int plusMonths = Integer.parseInt(args[1]);
            YearMonth endMonth = startMonth.plusMonths(plusMonths);
            int endDays = endMonth.lengthOfMonth();
            System.out.println(zdt);
            System.out.printf("%s plus %d month(s) is month %s, which has max of %d days", startMonth, plusMonths, endMonth, endDays);
        }
        catch(Throwable t) {
            t.printStackTrace();
        }
    }
}

java.time

由于月份不会在所有时区的同一时间发生变化,因此您需要为当月确定一个时区。与 @g00se 一样,我建议您使用 java.time,现代 Java 日期和时间 API,作为您的约会工作。

private static final ZoneId ZONE = ZoneId.of("Europe/Rome");

/**
 * @param mese Number of months to add to current month, 0 through 5
 * @return day number of the last day of the month mese months from now
 */
public int getmax(int mese) {
    if (mese < 0 || mese > 5) {
        throw new IllegalArgumentException("mese era " + mese);
    }
    return YearMonth.now(ZONE).plusMonths(mese).lengthOfMonth();
}

让我们用你的例子试试看。现在是八月。再过 3 个月就是 11 月了。 11 月的最后一天是 30 日。所以我们期望从以下调用中获得 30 个:

    int max = getmax(3);
    System.out.format(
            "In 3 months from now the last day of the month will be %d%n", max);            

输出为:

In 3 months from now the last day of the month will be 30

A YearMonth 是一年和一个月,例如 2021 年 8 月或 2021 年 11 月或 2022 年 1 月。因此,添加月份也适用于新年,您将获得下一年(或提前几年)的预期月份例如,如果您添加超过 12 个月)。让我们也从评论中尝试您的示例,添加 5 个月并预计 2022 年 1 月,因此 31 天:

    int max = getmax(5);
    System.out.format(
            "In 5 months from now the last day of the month will be %d%n", max);

In 5 months from now the last day of the month will be 31

Link

Oracle tutorial: Date Time 解释如何使用 java.time。