Год рождения jar до лета

Как рассчитать чей-то возраст на Java?

Я хочу вернуть возраст в годах как int в Java-методе. Теперь у меня есть следующее: getBirthDate() возвращает объект Date (с датой рождения; -)):

Но поскольку getYear() устарел, мне интересно, есть ли лучший способ сделать это? Я даже не уверен, что это работает правильно, поскольку у меня нет модульных тестов (пока).

Передумал по этому поводу: другой вопрос имеет приблизительное количество лет между датами, а не по-настоящему правильный возраст.

Учитывая, что он возвращает int, вы можете уточнить, что вы подразумеваете под «правильным» возрастом?

Дата против Календаря является фундаментальной концепцией, которую можно почерпнуть из прочтения документации Java. Я не могу понять, почему за это так много проголосовало.

@demongolem . Дата и календарь легко понять ?! Нет, совсем нет. Здесь есть множество вопросов по теме переполнения стека. В рамках проекта Joda-Time была создана одна из самых популярных библиотек, которая заменила эти хлопотные уроки даты и времени. Позже Sun, Oracle и сообщество JCP приняли JSR 310 ( java.time ), признав, что унаследованные классы были безнадежно неадекватными. Для получения дополнительной информации см. Руководство по Oracle .

28 ответов

JDK 8 делает это простым и элегантным:

public class AgeCalculator < public static int calculateAge(LocalDate birthDate, LocalDate currentDate) < if ((birthDate != null) && (currentDate != null)) < return Period.between(birthDate, currentDate).getYears(); >else < return 0; >> > 

Тест JUnit для демонстрации его использования:

public class AgeCalculatorTest < @Test public void testCalculateAge_Success() < // setup LocalDate birthDate = LocalDate.of(1961, 5, 17); // exercise int actual = AgeCalculator.calculateAge(birthDate, LocalDate.of(2016, 7, 12)); // assert Assert.assertEquals(55, actual); >> 

Теперь все должны использовать JDK 8. Все более ранние версии завершили жизнь поддержки.

Я бы предпочел не return 0 а использовать Integer и null чтобы соответствовать обнуляемости параметров.

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

Почему ты хочешь? Вы все еще используете Windows XP? Там определенная степень валюты, которая необходима. Исправления безопасности недоступны для более старых версий.

@SteveOh SteveOh Я не согласен. Я бы предпочел вообще не принимать null , а вместо этого использовать Objects.requireNonNull .

Отъезд Joda, что упрощает вычисления даты и времени (Joda также является основой новой стандартной даты/времени Java date/поэтому вы будете изучать API-интерфейс, доступный по скоростному стандарту).

EDIT: Java 8 имеет что-то очень похожее и стоит проверить.

LocalDate birthdate = new LocalDate (1970, 1, 20); LocalDate now = new LocalDate(); Years age = Years.yearsBetween(birthdate, now); 

который так же прост, как вы могли бы захотеть. Пред-Java-материал 8 (как вы уже определили) несколько неинтуитивный.

@HoàngLong: HoàngLong: из JavaDocs: «Этот класс представляет не день, а миллисекундный момент в полночь. Если вам нужен класс, представляющий весь день, то Interval или LocalDate могут быть более подходящими». Мы действительно хотим представить дату здесь.

Читайте также:  Парит выхлопная труба летом

Если вы хотите сделать это так, как предлагает @JohnSkeet, это выглядит так: Years age = Years.yearsBetween (new LocalDate (getBirthDate ()), new LocalDate ());

Не знаю, почему я использовал DateMidnight, и я отмечаю, что это устарело. Теперь изменилось на использование LocalDate

@IgorGanapolsky На самом деле главное отличие состоит в том, что Joda-Time использует конструкторы, а Java-8 и ThreetenBP используют статические фабричные методы. Чтобы увидеть небольшую ошибку в том, как Joda-Time рассчитывает возраст, пожалуйста, посмотрите на мой ответ, где я дал обзор поведения различных библиотек.

Calendar now = Calendar.getInstance(); Calendar dob = Calendar.getInstance(); dob.setTime(. ); if (dob.after(now)) < throw new IllegalArgumentException("Can't be born in the future"); >int year1 = now.get(Calendar.YEAR); int year2 = dob.get(Calendar.YEAR); int age = year1 - year2; int month1 = now.get(Calendar.MONTH); int month2 = dob.get(Calendar.MONTH); if (month2 > month1) < age--; >else if (month1 == month2) < int day1 = now.get(Calendar.DAY_OF_MONTH); int day2 = dob.get(Calendar.DAY_OF_MONTH); if (day2 >day1) < age--; >> // age is now correct 

Да, класс календаря ужасен. К сожалению, на работе иногда приходится этим пользоваться: /. Спасибо Cletus за публикацию этого

Замените Calendar.MONTH и Calendar.DAY_OF_MONTH на Calendar.DAY_OF_YEAR, и это будет, по крайней мере, немного чище

Современный ответ и обзор

a) Java-8 (java.time-package)

LocalDate start = LocalDate.of(1996, 2, 29); LocalDate end = LocalDate.of(2014, 2, 28); // use for age-calculation: LocalDate.now() long years = ChronoUnit.YEARS.between(start, end); System.out.println(years); // 17 

Обратите внимание, что выражение LocalDate.now() неявно связано с системным часовым поясом (который часто игнорируется пользователями). Для ясности обычно лучше использовать перегруженный метод now(ZoneId.of(«Europe/Paris»)) с указанием явного часового пояса (здесь, например, «Европа/Париж» ). Если запрошен системный часовой пояс, то мое личное предпочтение — написать LocalDate.now(ZoneId.systemDefault()) , чтобы сделать связь с системным часовым поясом более понятным. Это больше усилий для написания, но облегчает чтение.

Обратите внимание, что предлагаемое и принятое решение Joda-Time дает другой результат вычисления для дат, показанных выше (редкий случай), а именно:

LocalDate birthdate = new LocalDate(1996, 2, 29); LocalDate now = new LocalDate(2014, 2, 28); // test, in real world without args Years age = Years.yearsBetween(birthdate, now); System.out.println(age.getYears()); // 18 

Я рассматриваю это как небольшую ошибку, но команда Joda имеет другое представление об этом странном поведении и не хочет ее исправлять (странно, потому что день конца даты меньше, чем дата начала, поэтому год должен быть на один меньше). См. Также этот закрытый issue.

c) java.util.Calendar и т.д.

Для сравнения см. различные другие ответы. Я бы не рекомендовал использовать эти устаревшие классы вообще, потому что полученный код по-прежнему ошибочен в некоторых экзотических случаях и/или слишком сложным, учитывая тот факт, что исходный вопрос звучит так просто. В 2015 году у нас есть действительно лучшие библиотеки.

Предлагаемое решение прост, но иногда может провалиться в случае високосных лет. Просто оценка дня года не является надежной.

e) Моя собственная библиотека Time4J:

Это похоже на Java-8-решение. Просто замените LocalDate на PlainDate и ChronoUnit.YEARS на CalendarUnit.YEARS . Однако для получения «сегодня» требуется явная ссылка на часовой пояс.

PlainDate start = PlainDate.of(1996, 2, 29); PlainDate end = PlainDate.of(2014, 2, 28); // use for age-calculation (today): // => end = SystemClock.inZonalView(EUROPE.PARIS).today(); // or in system timezone: end = SystemClock.inLocalView().today(); long years = CalendarUnit.YEARS.between(start, end); System.out.println(years); // 17 

Спасибо за версию Java 8! Это сэкономило мне время 🙂 Теперь мне осталось только выяснить, как извлечь оставшиеся месяцы. Например, 1 год и 1 месяц. 🙂

Читайте также:  Модные модели лета 2020

@thomas77 thomas77 Спасибо за ответ, объединенные годы и месяцы (и, возможно, дни) можно сделать с помощью `java.time.Period ‘в Java-8. Если вы также хотите учесть другие единицы измерения, например часы, то Java-8 не предлагает решения.

Я предлагаю указывать часовой пояс при использовании LocalDate.now . Если опущен, текущий часовой пояс JVM по умолчанию применяется неявно. Это значение по умолчанию может меняться между компьютерами / ОС / настройками, а также может в любой момент во время выполнения с помощью любого кода, вызывающего setDefault . Я рекомендую быть конкретным, например LocalDate.now( ZoneId.for( «America/Montreal» ) )

@BasilBourque Я изменил свой ответ, связанный с Java-8, чтобы включить ваш комментарий и посоветовать пользователям быть как можно более конкретными.

@GoCrafter_LP Да, вы можете применить ThreetenABP, имитирующий Java-8, или Joda-Time-Android (от D. Lew) или мою lib Time4A для таких более старых версий Android.

/** * This Method is unit tested properly for very different cases , * taking care of Leap Year days difference in a year, * and date cases month and Year boundary cases (12/31/1980, 01/01/1980 etc) **/ public static int getAge(Date dateOfBirth) < Calendar today = Calendar.getInstance(); Calendar birthDate = Calendar.getInstance(); int age = 0; birthDate.setTime(dateOfBirth); if (birthDate.after(today)) < throw new IllegalArgumentException("Can't be born in the future"); >age = today.get(Calendar.YEAR) - birthDate.get(Calendar.YEAR); // If birth date is greater than todays date (after 2 days adjustment of leap year) then decrement age one year if ( (birthDate.get(Calendar.DAY_OF_YEAR) - today.get(Calendar.DAY_OF_YEAR) > 3) || (birthDate.get(Calendar.MONTH) > today.get(Calendar.MONTH )))< age--; // If birth date and todays date are of same month and birth day of month is greater than todays day of month then decrement age >else if ((birthDate.get(Calendar.MONTH) == today.get(Calendar.MONTH )) && (birthDate.get(Calendar.DAY_OF_MONTH) > today.get(Calendar.DAY_OF_MONTH ))) < age--; >return age; > 

Какова цель проверки (birthDate.get(Calendar.DAY_OF_YEAR) — today.get(Calendar.DAY_OF_YEAR) > 3) ? Это кажется бессмысленным с существованием сравнения месяца и дня месяца.

Если вы используете GWT, вы будете ограничены использованием java.util.Date, вот метод, который принимает дату как целые числа, но все еще использует java.util.Date:

public int getAge(int year, int month, int day) < Date now = new Date(); int nowMonth = now.getMonth()+1; int nowYear = now.getYear()+1900; int result = nowYear - year; if (month >nowMonth) < result--; >else if (month == nowMonth) < int nowDay = now.getDate(); if (day >nowDay) < result--; >> return result; > 

Источник

Возврат дат дней рождения

В задании необходимо написать код, который возвращает все даты дня рождения до текущей даты. Тесты к заданию предполагают, что дата дня рождения может быть любой, но изначально в задании даны значения переменных дня рождения, от которого начинается отсчёт. Вот моя попытка написания кода.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
public class Birthdays { public static void main(String[] args) { int day = 31; int month = 12; int year = 1990; System.out.println(collectBirthdays(year, month, day)); } public static String collectBirthdays(int year, int month, int day)  return ""; } }

Число дней до празднования дня рождения
Всем здравствуйте! Преподаватель задал непростую задачку: Дата1 (вводимая интересующая нас, а.

Читайте также:  Самые популярные треки этого лета 2021

Сформировать файл записей «FREND» из фамилий и дат (день, месяц и год) дней рождения ваших друзей
Сформировать файл записей «FREND» из фамилий и дат (день, месяц и год) дней рождения ваших друзей.

Нахождение дней между диапазоном дат(не кол-во дней, а сами дни)
Всем привет, возникла такая задачка: есть начальная и конечная даты, нужно найти дни между ними, не.

Подсчитайте количество дней рождения, которые приходятся на каждый из дней недели
Добрый день! Кто-нибудь делал такой запрос: "Подсчитайте количество дней рождения, которые.

Функция, принимающая на вход дату рождения и текущую дату, и вычисляющая число дней до дня рождения
помогите сделать работу по с++ Создать функцию, которая принимает на вход дат рождения и текущую.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public static String collectBirthdays(int year, int month, int day) { LocalDate today = LocalDate.now().plusDays(1); LocalDate birthday = LocalDate.of(year, month, day); DateTimeFormatter format = DateTimeFormatter.ofPattern(" - dd.MM.yyyy - E", Locale.ENGLISH); int number = 0; String text = ""; while (birthday.isBefore(today)){ String numberB = String.valueOf(number); text = text + numberB + format.format(birthday) + System.lineSeparator(); number++; birthday= birthday.plusYears(1); } return text; }

Источник

Отобразить возраст от даты рождения

Товарищи, подскажите простой скрипт для вывода возраста о даты рождения?
Например, есть биография человека. В скрипте указываю дату рождения 14 09 1980. Соответственно, скрипт должен отобразить цифру 40. При этом, скрипт должен учитывать сегодняшнюю дату и год, и обновлять информацию текущего года. Т.е, чтобы в 2021 году, возраст отображался уже как 41. Судя по подсказкам в скрипте будет?

Добавлено через 6 минут
Вот есть такой скрипт отображения возраста. Будет ли он обновлять возраст с учётом следующего года?

1 2 3 4 5 6 7 8 9 10 11 12 13 14
var now = new Date(); //Текущя дата var today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); //Текущя дата без времени var dob = new Date(1990, 9, 31); //Дата рождения var dobnow = new Date(today.getFullYear(), dob.getMonth(), dob.getDate()); //ДР в текущем году var age; //Возраст //Возраст = текущий год - год рождения age = today.getFullYear() - dob.getFullYear(); //Если ДР в этом году ещё предстоит, то вычитаем из age один год if (today  dobnow) { age = age-1; } document.write (`Возраст: ${age}`);

Источник

Оцените статью