如何正确计算日常方法

时间:2016-09-10 01:19:18

标签: java algorithm

嗨以下方法不太有效:

public static int dayInYear(int day, int month, int year) {
// Returns the number (1.. 366) of the day on which day/month/year falls
int dayNumber = (month - 1) * 31 + day;
if (month > 2) {
  dayNumber = dayNumber - ((4 * month + 23) / 10);
if (isLeapYear(year)) dayNumber++;
}
 return dayNumber;
} // dayInYear

public static boolean isLeapYear(int year)
{
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}

当我把它放入一个程序时,它编译但没有给出正确的答案 我做了桌面检查,问题出在dayInYear方法

例如:2009年2月5日应该收益36但我得到122

对正确方法的任何见解表示赞赏......

2 个答案:

答案 0 :(得分:2)

java.time

看起来你正试图推出自己的日常计算器。但是,如果您想利用前面的开发人员的辛勤工作,您可以使用java.timeLocalDate在一个简单的单行中进行此计算。

public static int dayInYear(int day, int month, int year) {
    return LocalDate.of(year, month, day).getDayOfYear();
}

这些java.time类内置于Java 8及更高版本中,请参阅Oracle Tutorial

答案 1 :(得分:1)

让我运行你的代码:

public static void main(String[] args) {
    System.out.println(dayInYear(5, 2, 2009));
    System.out.println(dayInYear(2, 5, 2009));
}

输出:

36
122

你说你得到122,所以你将它作为上述主要方法中的第二行调用:dayInYear(2, 5, 2009)

这相当于日期" 2009年5月2日" - 因为您自己的方法dayInYear中的参数顺序是:日,月,年。

你说你想要日期" 2009年2月5日"。在这种情况下,您应该将其作为dayInYear(5, 2, 2009)传递(上述主方法中的第一行)。然后结果是36,如你所料。

因此您的代码没有任何问题,但是,您需要正确调用它。