Проверьте, находится ли время между двумя значениями - всегда возвращайте 0 - PullRequest
0 голосов
/ 19 мая 2019

У меня есть функция для отображения предупреждения, если время между двумя значениями.

Например:

start = 07: 00: 00

end = 17:00: 00

assert start != null;
                        int from = Integer.valueOf(start.replace(":", ""));
                        assert end != null;
                        int to = Integer.valueOf(end.replace(":", ""));
                        Date date = new Date();
                        Calendar c = Calendar.getInstance();
                        c.setTime(date);
                        int t = c.get(Calendar.HOUR_OF_DAY) * 100 + c.get(Calendar.MINUTE);
                        boolean isBetween = to > from && t >= from && t <= to || to < from && (t >= from || t <= to);
                        a = isBetween ? 1 : 0;

                        if(a == 1) { 
                           alert_f();
                           // a is never 1...
                        }

Проблема в том, что a никогда не равен 1, даже если фактическое время находится между началом и концом.

есть идеи, почему?

Ответы [ 3 ]

2 голосов
/ 20 мая 2019

java.time и ThreeTenABP

    String start = "07:00:00";
    String end = "17:00:00";
    LocalTime startTime = LocalTime.parse(start);
    LocalTime endTime = LocalTime.parse(end);

    LocalTime now = LocalTime.now(ZoneId.of("Europe/Rome"));

    boolean isBetween = ! now.isBefore(startTime) && now.isBefore(endTime);
    int a = isBetween ? 1 : 0;
    System.out.println("Is between? " + isBetween + "; a = " + a);

Когда я запускал его сейчас (17:15 в Риме), я получил 0, как ты, что и ожидается. Если я укажу часовой пояс, в котором еще нет 5 вечера, я получу:

Между? правда; а = 1

Так что вам нужно выбрать правильный часовой пояс для кода. Если вы доверяете часовому поясу устройства, вы можете использовать ZoneId.systemDefault().

В моем логическом выражении я использую «не до» для обозначения «равно или после».

Я использую тот факт, что ваши временные строки имеют формат ISO 8601, формат, который LocalTime и другие классы java.time анализируют (и также печатают) как значения по умолчанию. Поэтому нам не нужен явный форматер для разбора.

Классы даты и времени, которые вы пытались использовать, Date и Calendar, давно устарели и плохо разработаны. Также целочисленные значения 70 000 и 170 000 на самом деле не имеют смысла в качестве представления вашего времени начала и окончания. Вместо этого я использую LocalTime из java.time, современного Java-API даты и времени. Это время суток без даты и без смещения UTC, поэтому, похоже, это именно то, что вам нужно здесь.

Вопрос: Могу ли я использовать 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 с подпакетами.

Ссылки

1 голос
/ 19 мая 2019

вы можете попробовать таким образом

    try {
        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        Date from = parser.parse("2019-12-31 07:00");
        Date to = parser.parse("2019-12-21 17:00");
        int a;
        Date userDate = parser.parse(new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));
        if (userDate.after(from) && userDate.before(to)) 
            a = 1;
         else
            a = 0;
    } catch (ParseException e) {
        // Invalid date was entered
    }
1 голос
/ 19 мая 2019

Ну, вы можете использовать SimpleDateFormat и получить время, а затем упростить его до:

assert start != null;
int from = Integer.valueOf(start.replace(":", ""));
assert end != null;
int to = Integer.valueOf(end.replace(":", ""));
// here the change
int currentTime = Integer.valueOf(new SimpleDateFormat("HH:mm:ss").format(new Date()).replace(":", ""));
boolean isBetween = to > from && currentTime >= from && currentTime <= to || to < from && (currentTime >= from || currentTime <= to);
// end
int a = isBetween ? 1 : 0;
...