2016-09-10 5 views
0

Hi следующий метод не совсем работа:Как рассчитать день в году метод правильно

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

Когда я положил его в программу он компилирует, но не дает права ответ Я проверил стол, и проблема в дневном режиме. Метод

Например: 5 февраля 2009 года должно получиться 36, но я получаю 122

Любое понимание для правильного метода ценится ...

+1

Ну, я просто пробежал по нему рукой ... и это работает ... Я не понимаю, что вы переходите в метод. это должно быть .. 'dayInYear (5, 2, 2009);', который вернет 36, потому что он будет делать только первый оператор – 3kings

+0

Теперь встроен в Java: 'LocalDate :: getDayOfYear'. См. [Ответ Хетгером] (http://stackoverflow.com/a/39421701/642706). –

ответ

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)

Это соответствует дате «2 мая 2009 года» - поскольку порядок аргументов по вашему собственному методу dayInYear: день, месяц, год.

Вы говорите, что хотите дату «5 февраля 2009 года». В этом случае вы должны передать его как dayInYear(5, 2, 2009) (первая строка в вышеуказанном основном методе). Тогда результат равен 36, как и ожидалось.

Так что в коде нет ничего плохого, однако его нужно вызвать правильно.

+0

Спасибо, что была проблема – user1560265

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.

+0

Действительно, глупая трата времени, чтобы сворачивать свои собственные классы времени, когда у нас есть [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package -summary.html). Эти классы вытесняют неприятные старые классы времени. Большая часть функциональных возможностей java.time портирована на Java 6 и 7 в [ThreeTen-Backport] (http://www.threeten.org/threetenbp/) и далее адаптирована к [Android] (https: // ru. wikipedia.org/wiki/Android_(operating_system)) в [ThreeTenABP] (https://github.com/JakeWharton/ThreeTenABP) (см. [* Как использовать ... *] (http://stackoverflow.com/q/38922754/642706)). –

Смежные вопросы