如何比较 java 中的两个小时?

How can I compare two hours in java?

我想计算餐厅的营业时间。我有两个字符串,例如:

String start_hour = "09:00";
String end_hour = "18:00";

例如当前时间:

    Calendar now = Calendar.getInstance();
    String current_hour = now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE);

I calculate open hours with this method:

    public boolean isRestaurantOpenNow() {
            try {
                Calendar now = Calendar.getInstance();
                String current_hour = now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE);
                String st_hour = "09:00";
                String en_hour = "18:00";
                @SuppressLint("SimpleDateFormat") final SimpleDateFormat format = new SimpleDateFormat("HH:mm");
                Date sth = null;
                sth = format.parse(st_hour);
                Date enh = format.parse(en_hour);
                Date nowh = format.parse(current_hour );
                if (nowh != null) {
                    if (nowh.before(enh) && nowh.after(sth)) {
                        // restaurant is open
                        return true;
                    } else {
                        // restaurant is close
                        return false;
                    }
                }
            } catch (ParseException ignored) {
            }
            return false;
        }

但我对此有些疑问。当 start_hour 为“13:00”且 end_hour 为“05:00”时,此方法会出错。因为从第二天起 05:00 小时。我该如何解决这个问题?

而不是

nowh.before(enh) && nowh.after(sth)

使用

nowh.before(enh) && nowh.after(sth) && sth.before(enh)
|| enh.before(sth) && !(nowh.before(enh) && nowh.after(sth))

除此之外,我认为日历 class 应该以不同的方式使用,我假设...

java.time 和 ThreeTenABP

public boolean isRestaurantOpenNow() {
    LocalTime startHour = LocalTime.parse("13:00");
    LocalTime endHour = LocalTime.parse("05:00");

    LocalTime currentHour = LocalTime.now(ZoneId.systemDefault());
    if (startHour.isBefore(endHour)) { // Both are on the same day
        return currentHour.isAfter(startHour) && currentHour.isBefore(endHour);
    } else { // end is on the next day
        return currentHour.isBefore(endHour) || currentHour.isAfter(startHour) ;
    }
}

刚刚试了一下(我的时区是 21:20):

    System.out.println(isRestaurantOpenNow());

输出为:

true

问题:java.time 不需要 Android API 26 级吗?

java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 和更新的 Android 设备上(从 API 级别 26)内置现代 API。
  • 非Android Java 6 和 7 获得 ThreeTen Backport,现代 类 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 类。

链接