Java 年度发现日

Java 年度发现日,java,Java,我正在尝试在您输入日期后查找一年中的哪一天。我有一个可行的方法,但它似乎不是最好的方法 我使用扫描器对象请求日期,然后将其发送到一个方法,在该方法中,它检查一年中的哪一天 public static int theDay(int month, int day, int year) { int numDay = day; /* Code here to check for leap year */ for(int i = 1; i < month; i++)

我正在尝试在您输入日期后查找一年中的哪一天。我有一个可行的方法,但它似乎不是最好的方法

我使用扫描器对象请求日期,然后将其发送到一个方法,在该方法中,它检查一年中的哪一天

public static int theDay(int month, int day, int year)
{
    int numDay = day;

    /* Code here to check for leap year */

    for(int i = 1; i < month; i++)
    {
        switch(i)
        {
           case 1:
             numDay += 31;
             break;
           case 2:
             numDay += 28;
             break;
           case 3:
             numDay += 31;
             break;
           ...
           ... //goes until case 12
           ...
        }
    }

    return numDay;
}
公共静态整数日(整数月、整数日、整数年)
{
int numDay=天;
/*这里的代码用于检查闰年*/
对于(int i=1;i

我不能使用日历、LocalDate、数组和我的老师还没有教过我们的任何东西。所以我相信只要循环就可以了。如前所述,这是有效的,我得到了正确的一天。但有什么更好的方法可以做到这一点呢?任何帮助都将不胜感激。谢谢

根据您使用的内容:

Java 8之前的标准Java库

Calendar calendar = new GregorianCalendar();
// Just to avoid corner cases
calendar.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
calendar.set(year, month - 1, day);
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);
乔达时间

LocalDate date = new LocalDate(year, month, day);
int dayOfYear = date.getDayOfYear();
Java8,使用
Java.time

LocalDate date = LocalDate.of(year, month, day);
int dayOfYear = date.getDayOfYear();
自己编写代码

(现在我们知道这就是你需要做的。)

如果你真的需要自己做的话,你目前的方法是可以的。不过,您可以在不使用循环的情况下执行此操作:

int daysInFebruary = ...; // Leap year calculation

switch (month)
{
    case 1:
        break; // Nothing to do
    case 2:
        numDay += 31; // Just add January
        break;
    case 3:
        numDay += 31 + daysInFebruary; // Add January and February
        break;
    case 4:
        numDay += 31 + daysInFebruary + 31; // Add January to March
        break;
    case 5:
        numDay += 31 + daysInFebruary + 31 + 30; // Add January to April
        break;
    // etc
    default:
        throw new IllegalArgumentException("Invalid month: " + month);
}
<>这是更有效率的,但是我认为它比你已经得到的代码更难读。


使用数组执行此操作会更简洁,请注意,您可以使用一个数组,其中一个数组的长度为每月,另一个数组的长度为每月的累积长度(0、31、59等)。加上闰年的特殊情况,鲍勃就是你叔叔。但是如果你不允许使用数组…

你使用的是什么版本的Java?我不能使用Calendar或LocalDate,因为我的老师不希望我们使用我们还没有学过的东西。也没有数组。@yayu:我想你应该在你的question@yayu当前位置你没想到在问题中提到这一点?显而易见的答案是“不要重新发明轮子”。。。如果你想要别的东西,你应该这么说。关于你的新答案,我一开始就是这样的。不幸的是,我的老师没有接受,因为这不是最好的方法。我问他到底想要什么,但没有给出任何线索。我没有提到它,因为我不认为它比我贴的东西好。@yayu:再说一次,你不想提到这个?考虑到你不能用“最好”的方式(即根本不自己编写逻辑),而且你对“最好”的方式没有任何要求,我建议你停下来。您已经有了工作代码,它的可读性是合理的(尽管您不需要案例12)。如果你的老师不接受,并且没有给你明确的理由,那么犯错的是你的老师,而不是你。