我想在您输入日期后找到一年中的某一天。我有办法,但它不是最好的方式。
我使用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,数组以及我的老师尚未教过我们的任何内容。所以,只要循环就可以了,我相信。如上所述,这是有效的,我得到了正确的一天。但是这样做更好的方法是什么?任何帮助,将不胜感激。谢谢!
答案 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等)。为闰年添加一个特例,鲍勃是你的叔叔。但是如果你不允许使用数组...