如何根据用户输入计算一年中的剩余天数

时间:2018-10-25 20:00:53

标签: java

我有一个家庭作业问题,其内容如下:编写一个程序,提示用户输入日期(以三个数字的形式:年月日),然后使用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;
}

}

5 个答案:

答案 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)

我认为使用LocalDateChronoUnit.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)来实现所需的功能。