Сравните разное время и отобразите сообщение об ошибке android

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

@Override
        public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute) throws ParseException {
            String AM_PM = " AM";
            String pattern = "HH:mm";
            SimpleDateFormat format = new SimpleDateFormat(pattern);

            String mm_precede = "";
            if (hourOfDay >= 12) {
                AM_PM = " PM";
                if (hourOfDay >=13 && hourOfDay < 24) {
                    hourOfDay -= 12;
                }
                else {
                    hourOfDay = 12;
                }
            } else if (hourOfDay == 0) {
                hourOfDay = 12;
            }
            if (minute < 10) {
                mm_precede = "0";
            }

     if (id == 1 && id ==2) {
         Date date1 = format.parse(sTimeApp.getText().toString());
         Date date2 = format.parse(eTimeApp.getText().toString());
         DateTime da1 = new DateTime(date1);
         DateTime da2 = new DateTime(date2);
         System.out.println("Date" + date1);
         System.out.println("Date" + date1);
         if (da1.equals(da2) ){
             Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
             return;
         }else if (da1.isBefore(da2)){
             Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
             return;
         }

     }


    //        if (sTimeApp.equals(eTimeApp) ) {
    //            Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
    //            return;
    //        }

            if (id == 1) {
                if (minute <= 9) {
                    sTimeApp.setText(hourOfDay + ":" +  mm_precede + minute + AM_PM);
                } else {

                    sTimeApp.setText(hourOfDay + ":" + mm_precede + minute + AM_PM);
                }
            } else if (id == 2) {
                if (minute <= 9) {
                    eTimeApp.setText(hourOfDay + ":" +  mm_precede + minute + AM_PM);
                } else {
                    eTimeApp.setText(hourOfDay + ":" + mm_precede + minute + AM_PM);
                }
            }

        }
    }

Это класс DateTime от Joda-Time, который вы используете? Или доморощенный?

Ole V.V. 12.09.2018 10:17

В качестве отступления подумайте о том, чтобы выбросить давно устаревший и общеизвестно проблемный SimpleDateFormat и его друзей и добавить ThreeTenABP в свой проект Android, чтобы использовать java.time, современный API даты и времени Java. С ним намного приятнее работать.

Ole V.V. 12.09.2018 10:34
id == 1 && id ==2 никогда не будет правдой (вы имели в виду id == 1 || id == 2?)
Ole V.V. 12.09.2018 10:50
0
3
220
1

Ответы 1

java.time

Думаю, вам нужно что-то вроде этого:

static DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH);

@Override
public void onTimeSet(int id, TimePicker view, int hourOfDay, int minute) {
    if (id == 1 || id == 2) {
        LocalTime start = LocalTime.parse(sTimeApp.getText(), timeFormatter);
        LocalTime end = LocalTime.parse(eTimeApp.getText(), timeFormatter);
        if (start.equals(end)) {
            Toast.makeText(this, "Error , Time should be different ", Toast.LENGTH_SHORT).show();
            return;
        } else if (end.isBefore(start)) {
            Toast.makeText(this, "Error , Time should not be before ", Toast.LENGTH_SHORT).show();
            return;
        }

        LocalTime newTime = LocalTime.of(hourOfDay, minute);
        String formattedTime = newTime.format(timeFormatter);
        if (id == 1) {
            sTimeApp.setText(formattedTime);
        } else {
            assert id == 2 : id;
            eTimeApp.setText(formattedTime);
        }
    }
}

Если вы уже используете Joda-Time, возможно, вы не захотите обновляться до java.time прямо сейчас. В Joda-Time также есть класс LocalTime, который вы можете использовать почти так же, как я использовал org.threeten.bp.LocalTime выше.

Я не уверен, хотели ли вы также сравнить время, установленное с помощью средства выбора времени, с начальным или конечным временем уже в sTimeApp или eTimeApp. Я не проводил такого сравнения.

Что пошло не так в вашем коде?

  • id == 1 && id ==2 не может быть правдой. В моем коде я предложил id == 1 || id == 2, но проверьте, что вы хотите.
  • Я подозреваю, что вы сравнили не так. Когда я читаю ваш код, вы выдаете сообщение об ошибке, если время начала раньше времени окончания, что я считаю нормальной и правильной ситуацией. В моем коде я вместо этого выдаю сообщение об ошибке, если время окончания раньше времени начала.
  • Кажется, вы вручную форматируете время для отображения. Это слишком сложный способ. Вместо этого я использую DateTimeFormatter для форматирования времени (опять же, Joda-Time имеет аналогичную функциональность).
  • Вы используете устаревшие классы SimpleDateFormat и Date. Вместо этого я рекомендую вам использовать java.time, современный API даты и времени Java. Если вы уже используете Joda-Time, это тоже хороший вариант. В обоих случаях полностью избегайте упомянутых устаревших классов, поскольку либо Joda-Time, либо java.time предлагают всю необходимую вам функциональность.

Вопрос: Могу ли я использовать java.time на Android?

Да, java.time прекрасно работает на старых и новых устройствах Android. Просто требуется как минимум Java 6.

  • В Java 8 и новее, а также на новых устройствах Android (как мне сказали, начиная с уровня API 26) современный API встроен.
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт новых классов (ThreeTen для JSR 310; см. Ссылки внизу).
  • На (более старом) Android используйте Android-версию ThreeTen Backport. Он называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

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