Расчет возраста из jDateChooser с использованием ZoneId продолжает возвращаться 0 - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь рассчитать возраст пользователей на основе их входных данных DOB и сравнить его с сегодняшней датой, чтобы определить их возраст в годах.Если им меньше 12 лет, им будет отказано.

int YearDiff;
public void ageCalc()
{
    ZoneId nowBrit = ZoneId.of("Europe/London");
    LocalDate timeBrit = LocalDate.now(nowBrit);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
    int YearNow = Integer.parseInt(sdf.format(timeBrit));
    int YearSel = Integer.parseInt(sdf.format(jDateChooserDOB.getDate()));
    YearDiff = YearNow - YearSel;
}

Затем будет проверена переменная YearDiff, чтобы определить, меньше ли она в операторе if, но она всегда возвращает 0.

Также, если есть лучший способ проверки возрастаПожалуйста, поделитесь.

Заранее спасибо

1 Ответ

0 голосов
/ 05 декабря 2018

Старомодный класс SimpleDateFormat не может форматировать ни один из современных объектов классов java.time, таких как LocalDate.Поэтому следующая строка выдает исключение:

    int YearNow = Integer.parseInt(sdf.format(timeBrit));

Исключение составляет java.lang.IllegalArgumentException: Cannot format given Object as a Date.Это приводит к тому, что оставшаяся часть вашего метода не будет выполнена.И поэтому вы никогда не присваиваете значение YearDiff.Это поле имеет значение по умолчанию 0, поэтому вы видите результат.

Видимо, вы не видели исключения?Если это так, у вас есть более серьезная проблема, чем неправильный результат, либо в вашем коде (пустой блок catch, известный как «проглатывание исключений»?), Либо в настройках проекта.Пожалуйста, исправьте это в первую очередь.

Откуда я родом, люди становятся на год старше в день своего рождения, а не в Новый год (когда меняется год).Я знаю, что это не так повсюду в мире.В любом случае, пожалуйста, поищите в Интернете правильный способ расчета возраста в соответствии с вашей культурой.Пропускайте страницы только с использованием старых и устаревших классов, таких как Date, Calendar, GregorianCalendar, DateFormat и SimpleDateFormat.С java.time работать намного удобнее, и он лучше поддерживает вычисление возраста.

PS Поскольку jDateChooserDOB.getDate() возвращает старомодный Date, преобразуйте его в Instant и выполните дальнейшие преобразования.Например:

    int yearSel = jDateChooserDOB.getDate().toInstant().atZone(nowBrit).getYear();
...