0

我需要编写一个代码,输入一个名为 mese 的整数(这个整数从 0 到 5),这个整数将被添加到当前月份,因为当我需要得到一个确切的最后一天时调用这个函数月份示例,现在是 8 月,我需要知道 8 月的最后一天 + mese,其中 mese =3 所以我需要知道 8 月的最后一天 + 3 = 11 月,所以在这种情况下函数将返回 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;
    }

感谢任何回答的人

4

2 回答 2

3

java.time

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

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);            

输出是:

从现在起的 3 个月内,该月的最后一天将是 30

AYearMonth是一年零一个月,例如 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);

从现在起的 5 个月内,该月的最后一天将是 31

关联

Oracle 教程:日期时间解释如何使用 java.time。

于 2021-08-23T18:55:39.603 回答
1

你可以使用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();
        }
    }
}
于 2021-08-23T16:46:01.743 回答