Я хочу вернуть возраст в годах как int в методе Java. Теперь у меня есть следующее, где getBirthDate () возвращает объект Date (с датой рождения ;-)):
public int getAge() {
long ageInMillis = new Date().getTime() - getBirthDate().getTime();
Date age = new Date(ageInMillis);
return age.getYear();
}
Но так как getYear () устарела, мне интересно, есть ли лучший способ сделать это? Я даже не уверен, что это работает правильно, так как у меня нет модульных тестов (пока).
Ответы:
JDK 8 делает это легко и элегантно:
Тест JUnit для демонстрации его использования:
Каждый должен сейчас использовать JDK 8. Все более ранние версии прошли срок поддержки.
источник
null
s вообще, а вместо этого использоватьObjects.requireNonNull
.Посмотрите на Joda , которая упрощает вычисления даты / времени (Joda также является основой нового стандартного API даты / времени Java, поэтому вы изучите API , который скоро станет стандартом).
РЕДАКТИРОВАТЬ: Java 8 имеет нечто очень похожее и стоит проверить.
например
это так просто, как вы могли бы хотеть. Материал до Java 8 (как вы определили) несколько не интуитивно понятен.
источник
источник
Современный ответ и обзор
а) Java-8 (пакет java.time)
Обратите внимание, что выражение
LocalDate.now()
неявно связано с часовым поясом системы (который часто упускается из виду пользователями). Для ясности, как правило, лучше использовать перегруженный метод сnow(ZoneId.of("Europe/Paris"))
указанием явного часового пояса (здесь, например, «Европа / Париж»). Если запрашивается системный часовой пояс, то я лично пишу,LocalDate.now(ZoneId.systemDefault())
чтобы сделать связь с системным часовым поясом более ясной. Это больше усилий для написания, но облегчает чтение.б) йода-тайм
Обратите внимание, что предложенное и принятое решение Joda-Time дает другой результат вычисления для дат, показанных выше (редкий случай), а именно:
Я считаю это небольшой ошибкой, но команда Joda по-другому смотрит на это странное поведение и не хочет его исправлять (странно, потому что день месяца конечной даты меньше даты начала, поэтому год должен быть одним меньще). Смотрите также этот закрытый вопрос .
в) java.util.Calendar и т. д.
Для сравнения смотрите различные другие ответы. Я бы вообще не рекомендовал использовать эти устаревшие классы, потому что в некоторых экзотических случаях результирующий код все еще подвержен ошибкам и / или слишком сложен, учитывая тот факт, что исходный вопрос звучит так просто. В 2015 году у нас действительно лучшие библиотеки.
г) О Date4J:
Предложенное решение простое, но иногда терпит неудачу в случае високосных лет. Просто оценка дня года не надежна.
д) Моя собственная библиотека Time4J :
Это работает аналогично Java-8-решению. Просто заменить
LocalDate
наPlainDate
иChronoUnit.YEARS
наCalendarUnit.YEARS
. Однако получение «сегодня» требует явной ссылки на часовой пояс.источник
LocalDate.now
. Если опущен, текущий часовой пояс JVM по умолчанию применяется неявно. Это значение по умолчанию может меняться между компьютерами / ОС / настройками, а также может в любой момент во время выполнения с помощью любого вызова кодаsetDefault
. Я рекомендую быть конкретным, например,LocalDate.now( ZoneId.for( "America/Montreal" ) )
источник
(birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3)
? Это кажется бессмысленным с существованием сравнения месяца и дня месяца.Я просто использую миллисекунды в постоянных значениях года в своих интересах:
источник
Если вы используете GWT, вы будете ограничены использованием java.util.Date, вот метод, который принимает дату как целые числа, но все еще использует java.util.Date:
источник
Правильный ответ с использованием JodaTime :
Вы можете даже сократить его в одну строку, если хотите. Я скопировал идею из ответа Брайана Агнью , но я считаю, что это более правильно, как вы видите из комментариев (и это точно отвечает на вопрос).
источник
С библиотекой date4j :
источник
Это улучшенная версия вышеупомянутой ... учитывая, что вы хотите, чтобы age был int. потому что иногда вы не хотите заполнять свою программу кучей библиотек.
источник
Возможно, удивительно отметить, что вам не нужно знать, сколько дней или месяцев в году или сколько дней в этих месяцах, также вам не нужно знать о високосных годах, високосных секундах или каких-либо других из этого материала, используя этот простой, 100% точный метод:
источник
Попробуйте скопировать это в свой код, затем используйте метод, чтобы узнать возраст.
источник
Я использую этот кусок кода для расчета возраста, надеюсь, это поможет .. нет библиотек, используемых
источник
Поля рождения и эффекта являются полями даты:
Это в основном модификация решения Джона О без использования устаревших методов. Я потратил немало времени, пытаясь заставить его код работать в моем коде. Может быть, это спасет других в этот раз.
источник
Что насчет этого?
источник
String
dateofbirth
имеет дату рождения. и формат любой (определенный в следующей строке):Вот как отформатировать:
Переменная
ageStr
будет иметь годы.источник
Элегантный, казалось бы, правильный вариант решения Yaron Ronen, основанный на разнице во времени.
Я включаю модульный тест, чтобы доказать, когда и почему это не правильно . Это невозможно из-за (возможно) разного количества високосных дней (и секунд) при любой разнице во времени. Расхождение должно составлять максимум + -1 день (и одна секунда) для этого алгоритма, см. Test2 (), тогда как решение Ярона Ронена, основанное на полностью постоянном предположении,
timeDiff / MILLI_SECONDS_YEAR
может отличаться на 10 дней для 40-летнего, тем не менее, этот вариант также неверен.Это сложно, потому что этот улучшенный вариант, использующий формулу
diffAsCalendar.get(Calendar.YEAR) - 1970
, большую часть времени возвращает правильные результаты, так как число високосных лет в среднем одинаково между двумя датами.источник
источник
источник
Вот код Java для расчета возраста в году, месяце и днях.
источник
Самый простой способ без каких-либо библиотек:
источник
ChronoUnit.YEARS.between( LocalDate.of( 1968 , Month.MARCH , 23 ) , LocalDate.now() )
. См. Правильный ответDateUtils
это библиотекаВ Java 8 мы можем рассчитать возраст человека с помощью одной строки кода:
источник
источник
источник
источник
источник
источник
Я ценю все правильные ответы, но это kotlin ответ на тот же вопрос
Я надеюсь, будет полезно для разработчиков Kotlin
источник