寻找一年中的一天

时间:2014-04-08 21:35:15

标签: java

我想在您输入日期后找到一年中的某一天。我有办法,但它不是最好的方式。

我使用Scanner对象询问日期,然后将其发送到一个方法,以检查一年中的哪一天。

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

我无法使用Calendar,LocalDate,数组以及我的老师尚未教过我们的任何内容。所以,只要循环就可以了,我相信。如上所述,这是有效的,我得到了正确的一天。但是这样做更好的方法是什么?任何帮助,将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:10)

取决于您使用的内容:

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

Joda时间

LocalDate date = new LocalDate(year, month, day);
int dayOfYear = date.getDayOfYear();

Java 8,使用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等)。为闰年添加一个特例,鲍勃是你的叔叔。但是如果你不允许使用数组...