Функция Kotlin для возврата логического значения между диапазоном дат / часов (Android)

#android #date #datetime #kotlin

#Android #Дата #дата и время #kotlin

Вопрос:

Я ищу пример с функцией, сравнивающей диапазон дат и часов, например, в ресторане для часов работы, функция возвращает true, если я введу параметры Воскресенье — вторник с 10:00 до 23:00, как лучше всего это сделать? в Java / Kotlin есть несколько экземпляров даты, я немного смущен…

Комментарии:

1. @Raman ваш ответ не был полным, мне это не помогло. теперь у меня есть еще вопросы о моей проблеме…

Ответ №1:

Идиоматический способ Kotlin сделать это — определить часы работы вашего ресторана как ClosedRange<T> (где T какое-то значение даты / времени, см. Дальнейшее обсуждение Ниже), а затем использовать in оператор, чтобы определить, попадает ли указанное вами время в этот диапазон. Смотрите Диапазоны и прогрессии в документации Kotlin.

Для определения диапазона вы используете rangeTo функцию (или .. оператор), например:

 val range = start..end
 

Затем вы можете использовать contains функцию (или in оператор), например

 anInstant in range
 

чтобы определить, попадает ли данный момент anInstant в диапазон или нет.

Что касается фактического представления значений даты / времени, это зависит от ваших целевых платформ. Если вы ориентируетесь на JVM или Android, вы можете использовать любой из классов java.time . Например, вы можете использовать представление даты с учетом зоны, например ZonedDateTime , или такое, которое игнорирует все зоны вместе, например LocalDateTime , или такое, которое представляет конкретное Instant время независимо от зоны, в зависимости от бизнес-правил вашего приложения для обработки часовых поясов.

Если вы ориентируетесь на мультиплатформенность (например, native или JavaScript), то вам, вероятно, захочется изучить кроссплатформенную библиотеку с представлением даты и времени, например kotlinx-datetime.

Ответ №2:

Я не знаю, больше ли вы не ищете ответа, но в любом случае это ответ

 fun isNowInRange(start: LocalTime, stop: LocalTime, now: LocalTime): Boolean{
        return ( ! now.isBefore( start ) ) amp;amp; ! now.isAfter( stop )
    }
 

и вот как это использовать

 isNowInRange(LocalTime.of(9, 0), LocalTime.of(23, 0) // opne

!isNowInRange(LocalTime.of(9, 0), LocalTime.of(23, 0) // closed
 

и если есть какой-либо ресторан, который открыт после 24 часов ночи, вы можете написать это

 if (isNowInRange(LocalTime.of(9, 0), LocalTime.of(23, 0) amp;amp; isNowInRange(LocalTime.of(0, 0), LocalTime.of(4, 0)){

// restaurant is open from 9am till 4am 
// do stuff here

}else{

// restaurant closed from 4am till 9am
// do stuff here

}