首页 > 解决方案 > 然后比较不同时间并显示错误消息android

问题描述

我花了 1 天的时间来比较两次,但直到现在还没有值得的结果。我基本上是在尝试比较两个不同的时间,我想避免第一次存储数据 id 少于第二次,但我不能。另外,相等的部分工作顺利,但第二部分不工作

@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);
                }
            }

        }
    }

标签: androidandroid-datepickerandroid-timepickerdatetime-comparisonandroid-time-square

解决方案


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,但请检查你想要什么。
  • 我怀疑你比较错误的方式。当我阅读您的代码时,如果开始时间在结束时间之前,您会发出一条错误消息,我认为这是正常和正确的情况。在我的代码中,如果结束时间在开始时间之前,我会发出一条错误消息。
  • 您似乎正在手动格式化显示时间。这是过于复杂的方式。相反,我使用 aDateTimeFormatter来格式化时间(同样,Joda-Time 具有类似的功能)。
  • 您正在使用过时的SimpleDateFormatDate类。相反,我建议您使用 java.time,这是现代 Java 日期和时间 API。如果您已经在使用 Joda-Time,那也是一个不错的选择。在这两种情况下,完全避免提到过时的类,因为 Joda-Time 或 java.time 提供了您需要的所有功能。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备(据我所知,从 API 级别 26 开始)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,即新类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从org.threeten.bp子包中导入日期和时间类。

链接


推荐阅读