Kotlin, итерация по календарю: возможно ли это?

#loops #date #kotlin #calendar #iteration

#циклы #Дата #kotlin #Календарь #итерация

Вопрос:

Я изучаю потенциал цикла через календарь в kotlin (в Android studio). В частности, я хотел бы выполнять операцию для каждого отдельного дня между двумя фиксированными датами. Я видел нечто подобное с java.time.LocalDate ( while (date.isBefore(EndDate)) ..{} ). Как вы думаете, это возможно и с календарем? Любые предложения будут высоко оценены. Спасибо

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

1. Я не совсем уверен, что понимаю ваш вариант использования. Вы действительно хотите, чтобы ваша программа работала все время, делая что-то только один раз в день? Разве в вашем распоряжении нет никаких средств планирования? Также я бы рекомендовал использовать kotlin.time или java.time вместо Calendar , зачем вам Calendar конкретно?

2. Дорогой Джоффри, спасибо, программа выполнит это вычисление только при нажатии кнопки. В приложении пользователь может установить дату, и при нажатии на эту кнопку программа должна производить вычисления с учетом каждого дня между вставленной датой и фиксированной — например, программа может изменить значение другой переменной, добавив значение, которое зависит от каждой конкретной даты между начальной и конечнойдата.

3. О, хорошо, я думаю, я понимаю. По сути, вы хотите просто получить доступ к последовательности / списку таких дат, а не выполнять действие в фактический день этих дат. Итак, да, мой вопрос все еще остается в силе: зачем использовать Calendar , а не более поздние API datetime?

4. Спасибо, Джоффри, за предложение, решаемое с использованием Localdate и iterator. Я нашел полезное решение на внешнем веб-сайте, могу ли я разместить ссылку здесь?

5. Вы должны ответить себе фрагментом кода (в качестве фактического ответа), а не публиковать ссылку. Это может помочь другим в будущем

Ответ №1:

Я нашел этот код, который идеально подходит для моего случая; я сообщаю об этом ниже, надеясь, что он будет полезен и другим.

 class DateIterator(val startDate: LocalDate,
               val endDateInclusive: LocalDate,
               val stepDays: Long): Iterator<LocalDate> {
private var currentDate = startDate

override fun hasNext() = currentDate <= endDateInclusive

override fun next(): LocalDate {

    val next = currentDate

    currentDate = currentDate.plusDays(stepDays)

    return next

}

}
    class DateProgression(override val start: LocalDate,
                  override val endInclusive: LocalDate,
                  val stepDays: Long = 1) : 
                               Iterable<LocalDate>, ClosedRange<LocalDate> {

override fun iterator(): Iterator<LocalDate> = 
                                  DateIterator(start, endInclusive, stepDays)

infix fun step(days: Long) = DateProgression(start, endInclusive, days)

    }

    operator fun LocalDate.rangeTo(other: LocalDate) = DateProgression(this, other)

    val startDate = LocalDate.of(2021, 1, 1)

    val endDate = LocalDate.of(2021, 1, 31)

    for (date in startDate..endDate step 1) {

        // do something

    }