Я хотел бы создать калькулятор возраста в форме регистрации без Joda Time, но у меня проблема с конкатенацией int. Он удаляет 0 из компонента дня (например, 04) и компонента месяца, поэтому совершенно неверно вычисляет возраст. Я пытался поместить его сначала в String
, а затем в int
, но это не работает.
private void setAge(View view) {
Calendar calendarB = Calendar.getInstance();
int years = calendarB.get(Calendar.YEAR);
int month = calendarB.get(Calendar.MONTH);
int day = calendarB.get(Calendar.DAY_OF_MONTH);
//int
currentDate = Integer.valueOf(String.valueOf(years) + String.valueOf(month + 1) + String.valueOf(day));
Calendar calendar = Calendar.getInstance();
datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//int
birthDate = Integer.valueOf(String.valueOf(year) + String.valueOf(monthOfYear + 1) + String.valueOf(dayOfMonth));
ageI = (currentDate - birthDate) / 10000;
String age = Integer.toString(ageI);
birth.setText(age);
datePickerDialog.dismiss();
}
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
}
Возможный дубликат Как рассчитать чей-то возраст в Java?
сначала получить возраст по это, а затем из этого int age
результата отформатировать его в String
как "99", "09" и установить обратно
@MCEmperor: я хотел бы настроить таргетинг на все API, с одной настройкой в Joda и одной в календаре, но я новичок, это бесполезно?
Ну, в настоящее время используется Calendar
неправильно. Вам следует использовать новый API даты и времени Java (в пакете java.time
). Если вам нужно ориентироваться на уровни API ниже 26, вы можете использовать Бэкпорт ThreeTen. Жонглирование целыми числами для вычисления возраста — не лучший способ. Вопрос, связанный с DangNguyen, дает простое решение: Period.between(birthDate, currentDate).getYears()
.
Я не нахожу, как в этом примере указать «дату рождения» и «текущую дату». В моем телефоне есть API 23, спасибо за ссылки.
Integer
всегда удаляйте предшествующий 0 из значения. Используйте этот метод/функцию для преобразования Int
в String
с предшествующим 0.
// ADDS 0 e.g - 02 instead of 2
public String checkDigit (int number) {
return number <= 9 ? "0" + number : String.valueOf(number);
}
РЕДАКТИРОВАТЬ
В вашем случае просто используйте эти строки
private void setAge(View view) {
Calendar calendarB = Calendar.getInstance();
int years = calendarB.get(Calendar.YEAR);
int month = calendarB.get(Calendar.MONTH);
int day = calendarB.get(Calendar.DAY_OF_MONTH);
//int
currentDate = Integer.valueOf(String.valueOf(years) + String.valueOf(month + 1) + String.valueOf(day));
Calendar calendar = Calendar.getInstance();
Calendar dob = Calendar.getInstance();
datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//int
birthDate = Integer.valueOf(String.valueOf(year) + String.valueOf(monthOfYear + 1) + String.valueOf(dayOfMonth));
// New code
dob.set(year, month, day);
int age = calendar.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (calendar.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)){
age--;
}
String age = checkDigit(age);
birth.setText(age);
datePickerDialog.dismiss();
}
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
}
Если у вас есть строка «04», и вы конвертируете ее в целое число, она всегда будет удалять предшествующий 0. Integer.valueOf()
никогда не возвращает предшествующий 0. Метод checkDigit()
всегда преобразует целое число в строку с предшествующим 0. но если вы снова проанализируете строку в целом, используя Integer.valueOf()
то он удалит 0.
Полегче, пожалуйста, @user392117. Я рекомендую подождать пару дней, прежде чем принимать ответ, поскольку вопросы без принятого ответа, как правило, привлекают больше внимания, поэтому дайте возможность получить больше ответов, прежде чем выбрать тот, который нужно принять. Я согласен, что принять ответ в конце - хороший стиль.
Что ж, жонглировать целыми числами для вычисления возраста — не лучший способ.
Во-первых, сейчас используется класс Calendar
неправильно. Вы должны использовать новый API даты и времени Java (в пакете java.time
). Метод between
класса Period
незаметно вычисляет разницу между этими двумя годами:
Period.between(birthDate, currentDate);
Затем вы можете вызвать getYears
, чтобы получить годы. Он использует тот факт, что, когда мы, люди, говорим о своем возрасте, мы вообще не округляем значение. Например, если мне завтра исполнится 30, сегодня мне все еще 29 лет.
Это должно работать:
final LocalDate now = LocalDate.now();
datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
LocalDate birthDate = LocalDate.of(year, monthOfYear, dayOfMonth);
int age = Period.between(birthDate, now).getYears();
birth.setText(String.valueOf(age));
datePickerDialog.dismiss();
}
}, now.getYear(), now.getMonthValue(), now.getDayOfMonth());
If you need to target API levels below 26, then you could use the ThreeTen ABP, which backports the Java 8 Date and Time functionality.
Спасибо ! Я буду искать, как использовать ThreeTen ABP сейчас, если у вас есть другие хорошие ссылки на это, я с удовольствием возьму ее. В любом случае большое спасибо за полный и исчерпывающий ответ!
Без Джоды? Почему? На какой уровень API вы все равно ориентируетесь?