Java МОО C 92,3 (я хочу понять, как решить этот вопрос, а не просто дать ответ) - PullRequest
0 голосов
/ 03 апреля 2020

Это упражнение от Java МОО C 92,3

Просто у меня есть две даты. И метод, который дает мне разницу между ними.

(например: 3/10/2011 и 3/9/2012)

Мой метод утверждает, что до тех пор, пока month и day больше, чем последующие, затем просто вычтите тот, для которого вызывается метод.

Вот проблема:

Если дата, указанная в качестве параметра, имеет больший год, то, когда я вычитаю эти две, я получаю отрицательное число (например: 2011 - 2012).

 public int differenceInYears(MyDate comparedDate){
    int result = 0;

    if(this.month >= comparedDate.month && this.day >= comparedDate.day){

        result = this.year - comparedDate.year;

    }else{
        result = this.year - comparedDate.year;
        result--;
    }

    return result;

Код, отличный от остального, относится к случаю, когда год не тот, каким он может выглядеть (пример: если бы я родился в мае 2000 года, технически мне должно быть 20, поскольку это 2020 , но, поскольку это еще не май, мне 19).

Мои условия все еще выполняются в первом операторе if, даже если результат неверен. Я попытался найти случай, когда я могу успокоить оба случая, когда не имеет значения, какая дата идет первой, но я борюсь с логи c. Был бы признателен за вклад.

1 Ответ

1 голос
/ 03 апреля 2020

Во-первых, если я правильно понимаю, что это упражнение, это прекрасное упражнение. Для производственной работы никогда не придумывать свой собственный класс дат, но для даты следует использовать LocalDate из стандартной библиотеки. И ChronoUnit.YEARS.between() для определения вашего возраста.

Если у вас еще не было дня рождения в этом году, вы хотите вычесть один год из результата. Это правильно. Так как же определить, наступит ли в этом году день рождения? Взгляните на следующие возможности. Я не запускал ваш код, поэтому заполнил последний столбец из того, что, как я думаю, произойдет при чтении кода.

Today  Birthday  Subtract 1?  Does your code subtract 1?
--------------------------------------------------------
Apr 3  Feb 1     No           No
Apr 3  Feb 6     No           Yes
Apr 3  Apr 1     No           No
Apr 3  Apr 6     Yes          Yes
Apr 3  May 1     Yes          Yes
Apr 3  May 6     Yes          Yes

Другой способ задать вопрос: если месяцы разные, нужны ли нам сравнивать день месяца тоже?

Мне нравится твое отношение. В соответствии с вашим названием я не выдаю правильно работающий код. Я также убежден, что вы не только узнаете больше, написав это самостоятельно, но и доставите больше удовольствия. Если вы все еще застряли, пожалуйста, оставьте комментарий, и я еще раз посмотрю.

РЕДАКТИРОВАТЬ: Для проблемы получения отрицательного результата, если даты находятся в обратном порядке : Самое простое решение - проверить результат после расчета. Если оно отрицательное, переделайте весь расчет с обратными датами. То есть с this. и comparedDate. в местах друг друга. Один из возможных вариантов заключается в том, что в этом случае вы указываете другому объекту MyDate выполнять вычисления. Вызвать метод differenceInYears другого объекта, передав в качестве аргумента this.

...