Android - проверьте, является ли текущее время между 2 указанными временами и днем ​​недели. - PullRequest
0 голосов
/ 26 сентября 2019

Я должен предпринять действия, если время падает между временем старта и остановки и в определенный день.Я сослался на некоторые существующие потоки на SO, чтобы проверить, попадает ли время в указанный диапазон времени.

Скажите, если время начала 23:00, время остановки 7:00 и текущее время 2:00.Просто функция валидности по времени возвращает true.Но если я включу дни в этот код, функция вернет false.Например: пользователь выбирает [понедельник, вторник, среда].Несмотря на то, что четверга нет в списке, но время окончания 7:00 утра приходится на четверг, действие может быть предпринято в любое время с 23:00 вечера. Среда - 7:00 четверга, но действие не может быть предпринято в 23:00 четверга или в другие дни.упоминается в списке.

Ниже мой код:

private fun isCurrentTimeBetweenProvidedTime(context: Context): Boolean {
        var reg = "^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$".toRegex()
        val startTime = getStartTime()
        val endTime = getEndTime()
        val currentTime = getCurrentTime()

        if (reg.containsMatchIn(startTime) && reg.containsMatchIn(endTime) && reg.containsMatchIn(currentTime)) {
            var valid = false

            var startTime = SimpleDateFormat("HH:mm:ss").parse(startTime)
            var startCalendar = Calendar.getInstance()
            startCalendar.time = startTime

            var currentTime = SimpleDateFormat("HH:mm:ss").parse(currentTime)
            var currentCalendar = Calendar.getInstance()
            currentCalendar.time = currentTime

            var endTime = SimpleDateFormat("HH:mm:ss").parse(endTime)
            var endCalendar = Calendar.getInstance()
            endCalendar.time = endTime

            if (currentTime.compareTo(endTime) < 0) {
                currentCalendar.add(Calendar.DATE, 1)
                currentTime = currentCalendar.time
            }

            if (startTime.compareTo(endTime) < 0) {
                startCalendar.add(Calendar.DATE, 1)
                startTime = startCalendar.time
            }

            if (currentTime.before(startTime)) {
                valid = false
            } else {
                if (currentTime.after(endTime)) {
                    endCalendar.add(Calendar.DATE, 1)
                    endTime = endCalendar.time
                }

                if (currentTime.before(endTime)) {
                    valid = true
                } else {
                    valid = false
                }
            }

            // This won't work if day is Thursday and time is 2:00am, even though time falls between 23:00-7:00
            var todayCalendar = Calendar.getInstance()
            if ((currentTime >= startTime && todayCalendar.get(Calendar.DAY_OF_WEEK) in selectedDays.values) &&
                    (currentTime <= endTime && (todayCalendar.get(Calendar.DAY_OF_WEEK) in selectedDays.values || todayCalendar.get(Calendar.DAY_OF_WEEK)-1 in selectedDays.values))) {
                Log.d(TAG, "Days are valid")
            }

            return valid
        }

        return false
    }

Как мне справиться со сценарием дней?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

java.time и ThreeTenABP

Обратите внимание: этот код может работать на уровнях Android API как ниже, так и выше уровня 26. Я объясню ниже.Мне придется доверить вам перевод с Java-кода.

Если я правильно понял ваши требования:

    ZoneId zone = ZoneId.of("America/Chihuahua");

    LocalTime startTime = LocalTime.of(23, 0);
    LocalTime endTime = LocalTime.of(7, 0);
    Set<DayOfWeek> selectedDays
            = EnumSet.of(DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY);

    ZonedDateTime now = ZonedDateTime.now(zone);
    LocalTime timeNow = now.toLocalTime();
    DayOfWeek currentDayOfWeek = now.getDayOfWeek();
    boolean inIntervalOnDay;
    if (startTime.isAfter(endTime)) { // crosses midnight
        if (timeNow.isBefore(endTime)) { // in interval, after midnight
            // Day is correct if the day before is among the selected days
            inIntervalOnDay = selectedDays.contains(currentDayOfWeek.minus(1));
        } else if (timeNow.isBefore(startTime)) {
            inIntervalOnDay = false;
        } else { // after start time, before midnight
            inIntervalOnDay = selectedDays.contains(currentDayOfWeek);
        }
    } else {
        inIntervalOnDay = ! timeNow.isBefore(startTime)
                && timeNow.isBefore(endTime)
                && selectedDays.contains(currentDayOfWeek);
    }
    System.out.println("Now: " + now + " (" + currentDayOfWeek + ") Valid? " + inIntervalOnDay);

Когда я только что запустил фрагмент, вывод был:

Сейчас: 2019-09-27T03: 47: 56.856-06: 00 [Америка / Чихуахуа] (пятница) Действительно?false

Пожалуйста, укажите желаемый часовой пояс, если это не Америка / Чихуахуа.Часовой пояс имеет значение.

Вопрос: Могу ли я использовать java.time на Android ниже API уровня 26?Как?

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

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

Ссылки

0 голосов
/ 26 сентября 2019

Одним из возможных подходов может быть нормализация вашего времени к смещениям от выбранной начальной недели, например, в воскресенье, 12:00 = 0. Преобразуйте все ваши времена в минуты с начальной точки.Затем просто проверьте, попадает ли выбранное вами время (также переведенное в минуты с момента запуска) в какой-либо из диапазонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...