我有一个家庭作业问题,其内容如下:编写一个程序,提示用户输入日期(以三个数字的形式:年月日),然后使用getDays()
方法来计算从给定日期到新年的天数。以下是一些示例运行:
请输入日期:2018 12 20 距新年还有12天。 请输入日期:1980 1 5 距离新年还有362天。
这是我到目前为止的代码:
public class Lab9Question4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter a date: ");
int year = input.nextInt();
int month = input.nextInt();
int days = input.nextInt();
input.close();
long diff = getDays(year, month) - days;
long days_diff = diff + 1;
System.out.println("There are " + days_diff + " day(s) until New Year.");
}
public static int getDays(int year, int month) {
int number_Of_DaysInMonth = 0;
switch (month) {
case 1:
number_Of_DaysInMonth = 31;
break;
case 2:
if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
number_Of_DaysInMonth = 29;
} else {
number_Of_DaysInMonth = 28;
}
break;
case 3:
number_Of_DaysInMonth = 31;
break;
case 4:
number_Of_DaysInMonth = 30;
break;
case 5:
number_Of_DaysInMonth = 31;
break;
case 6:
number_Of_DaysInMonth = 30;
break;
case 7:
number_Of_DaysInMonth = 31;
break;
case 8:
number_Of_DaysInMonth = 31;
break;
case 9:
number_Of_DaysInMonth = 30;
break;
case 10:
number_Of_DaysInMonth = 31;
break;
case 11:
number_Of_DaysInMonth = 30;
break;
case 12:
number_Of_DaysInMonth = 31;
}
return number_Of_DaysInMonth;
}
}
我知道我需要在某个地方使用循环,以获取用户输入后的剩余天数并将其添加到日期差中,以获取直到新年的天数,但是我不确定要在哪里插入循环以及其中应包含的内容。任何帮助表示赞赏:)
更新:感谢所有人的快速答复,此代码现在可以完美运行!下面的新代码适用于将来可能需要使用它的任何其他人:
public class Lab9Question4 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Please enter a date: ");
int year = input.nextInt();
int month = input.nextInt();
int days = input.nextInt();
input.close();
int remainingDays = getDays(month, year) - days + 1;
for (int currentMonth = month; currentMonth <= 12; currentMonth++) {
remainingDays += getDays(year, currentMonth);
}
System.out.println("There are " + remainingDays + " day(s) until New Year.");
}
public static int getDays(int year, int month) {
int number_Of_DaysInMonth = 0;
switch (month) {
case 1:
number_Of_DaysInMonth = 31;
break;
case 2:
if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
number_Of_DaysInMonth = 29;
} else {
number_Of_DaysInMonth = 28;
}
break;
case 3:
number_Of_DaysInMonth = 31;
break;
case 4:
number_Of_DaysInMonth = 30;
break;
case 5:
number_Of_DaysInMonth = 31;
break;
case 6:
number_Of_DaysInMonth = 30;
break;
case 7:
number_Of_DaysInMonth = 31;
break;
case 8:
number_Of_DaysInMonth = 31;
break;
case 9:
number_Of_DaysInMonth = 30;
break;
case 10:
number_Of_DaysInMonth = 31;
break;
case 11:
number_Of_DaysInMonth = 30;
break;
case 12:
number_Of_DaysInMonth = 31;
}
return number_Of_DaysInMonth;
}
}
答案 0 :(得分:2)
我建议您检查LocalDate类的文档。
.until()
方法适合您的情况。您不必手动进行计算。
答案 1 :(得分:0)
您应该为此目的使用日期感知类,但仅仅是出于娱乐目的,更重要的是出于教育目的,您可以按照这种方式开始学习:
int remainingDays = getDays(month, year) - days + 1;
for(int currentMonth = month + 1; currentMonth <= 12; currentMonth++) {
remainingDays += getDays(year, currentMonth);
}
答案 2 :(得分:0)
我建议您为问题的每个部分都使用命名良好的帮助方法。它将使您的代码更易于理解和使用。
例如:
public static boolean isLeapYear(int year) {
return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
public static int daysInMonth(int year, int monthNum) {
int[] days = {9999, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (monthNum == 2 && isLeapYear(year)) {
return 29;
}
return days[monthNum];
}
顺便说一句,我之所以调用参数monthNum
而不是month
的原因是为了更清楚地表明它不是基于零的,一月= 0,依此类推。我还把{{ 1}}在元素9999
的数组中,以确保如果发生此错误,它将在计算中脱颖而出。
对于循环,您需要从指定的月份到0
年末,保持每个月份中的天数之和,然后减去当前月份的指定天数。
答案 3 :(得分:0)
我认为使用LocalDate
和ChronoUnit.DAYS.between()
LocalDate date = LocalDate.of(year, month, days);
LocalDate newYearsDay = LocalDate.of(year + 1, 1, 1);
long dif = ChronoUnit.DAYS.between(date, newYearsDay);
System.out.println("There are " + dif + " day(s) until New Year.");
答案 4 :(得分:0)
您的问题可以是“如何计算一个期间的天数?”的重复项。这里: https://github.com/Microsoft/aspnet-api-versioning/wiki/API-Documentation 您可以使用Period.between(date,newYearDate)并将其转换为days或ChronoUnit.DAYS.between(date,newYearDate)来实现所需的功能。