用于获取一个月的最后一天的代码中的逻辑错误
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。
我需要编写一个代码,输入一个名为 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。