Я хочу рассчитать часы работы ресторана. У меня есть две строки, например:

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 час со следующего дня. Как я могу решить эту проблему?

-3
Benfactor 19 Дек 2019 в 22:37

2 ответа

Лучший ответ

Вместо

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

Использование

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

Кроме того, я думаю, что класс Calendar должен использоваться по-другому, я полагаю ...

1
Alex 19 Дек 2019 в 19:55

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());

Выход был:

правда

Вопрос: Разве java.time не требует Android API уровня 26?

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

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

Связи

1
Ole V.V. 19 Дек 2019 в 20:21