#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
}