Я хочу рассчитать часы работы ресторана. У меня есть две строки, например:
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 час со следующего дня. Как я могу решить эту проблему?
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 должен использоваться по-другому, я полагаю ...
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
с подпакетами.
Связи
- Обучающее руководство по Oracle: дата и время, объясняющее, как использовать java.time.
- Запрос спецификации Java (JSR) 310, где
java.time
был первым описано . - проект ThreeTen Backport, обратный порт
java.time
для Java 6 и 7 (ThreeTen для JSR -310 ) . - ThreeTenABP, Android-версия ThreeTen Backport
- Вопрос: Как использовать ThreeTenABP в Android Project, с очень тщательным объяснение.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].