Как включить автоматическое удаление 0 в день и месяц в дате

Я хотел бы создать калькулятор возраста в форме регистрации без 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));
}

Без Джоды? Почему? На какой уровень API вы все равно ориентируетесь?

MC Emperor 09.04.2019 11:48

Возможный дубликат Как рассчитать чей-то возраст в Java?

Dang Nguyen 09.04.2019 11:52

сначала получить возраст по это, а затем из этого int age результата отформатировать его в String как "99", "09" и установить обратно

Dang Nguyen 09.04.2019 11:53

@MCEmperor: я хотел бы настроить таргетинг на все API, с одной настройкой в ​​​​Joda и одной в календаре, но я новичок, это бесполезно?

Moh 09.04.2019 12:00

Ну, в настоящее время используется Calendarнеправильно. Вам следует использовать новый API даты и времени Java (в пакете java.time). Если вам нужно ориентироваться на уровни API ниже 26, вы можете использовать Бэкпорт ThreeTen. Жонглирование целыми числами для вычисления возраста — не лучший способ. Вопрос, связанный с DangNguyen, дает простое решение: Period.between(birthDate, currentDate).getYears().

MC Emperor 09.04.2019 12:04

Я не нахожу, как в этом примере указать «дату рождения» и «текущую дату». В моем телефоне есть API 23, спасибо за ссылки.

Moh 09.04.2019 12:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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.

Jitesh Prajapati 09.04.2019 12:26

Полегче, пожалуйста, @user392117. Я рекомендую подождать пару дней, прежде чем принимать ответ, поскольку вопросы без принятого ответа, как правило, привлекают больше внимания, поэтому дайте возможность получить больше ответов, прежде чем выбрать тот, который нужно принять. Я согласен, что принять ответ в конце - хороший стиль.

Ole V.V. 09.04.2019 16:29

Что ж, жонглировать целыми числами для вычисления возраста — не лучший способ.

Во-первых, сейчас используется класс 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 сейчас, если у вас есть другие хорошие ссылки на это, я с удовольствием возьму ее. В любом случае большое спасибо за полный и исчерпывающий ответ!

Moh 09.04.2019 13:12

Другие вопросы по теме