【问题标题】:How to get the list of dates in a given range with recursion如何使用递归获取给定范围内的日期列表
【发布时间】:2021-11-07 01:09:29
【问题描述】:

我想创建一个函数,通过递归返回给定范围内的日期列表。我将提供开始日期、结束日期和递归类型。我不知道如何开始。任何的意见都将会有帮助。有没有这方面的图书馆,还是我必须自己做?

data class Date(
    val day: Int,
    val month: Int,
    val year: Int
)

enum class Recursion {
    NEVER,
    EVERY_DAY,
    EVERY_WORK_DAY,
    EVERY_WEEK,
    EVERY_MONTH,
    ANNUAL
}

fun createListOfEvents(startDate: Date, endDate: Date, recursion: Recursion): List<Date>{
}

【问题讨论】:

  • 你是什么意思“递归”?这个参数是干什么用的 - recursion: Recursion?您是指日期的步骤吗?
  • 是的,我就是这么想的
  • 您应该删除recursion 标签。 “递归”在编程中具有非常特定的含义,但您使用的是该词的其他含义。我无法将其删除,因为其他人开始编辑您的帖子,并且需要另外一个人批准。
  • 欢迎来到 SO!为什么你需要递归呢?您是否尝试过编写任何代码来填写此处的函数存根?你被困在哪里了?感谢您的上下文。

标签: android kotlin recursion recurrence


【解决方案1】:

如果目标 SDK desugaring。

然后您可以为此使用 LocalDate 类。您的 Date 类有点多余,但如果您想保留它,可以在函数内部将其转换为 LocalDate。

fun createListOfEvents(startDate: LocalDate, endDate: LocalDate, recursion: Recursion): List<LocalDate> {
    val step = when (recursion) {
        Recursion.NEVER -> return emptyList()
        Recursion.EVERY_DAY, Recursion.EVERY_WORK_DAY -> Period.ofDays(1)
        Recursion.EVERY_WEEK -> Period.ofWeeks(1)
        Recursion.EVERY_MONTH -> Period.ofMonths(1)
        Recursion.ANNUAL -> Period.ofYears(1)
    }
    var date = startDate
    val list = mutableListOf<LocalDate>()
    while (date <= endDate) {
        list.add(date)
        date += step
    }
    if (recursion == Recursion.EVERY_WORK_DAY) {
        val weekend = listOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)
        list.removeAll { it.dayOfWeek in weekend }
    }
    return list
}

【讨论】:

    【解决方案2】:

    嗯,基本上这是一个如何做到这一点的示例:

    data class Recursion(val field : TemporalUnit, val step: Long)
    
        val step1Day = Recursion(field = ChronoUnit.DAYS, step = 1)
    
        fun createListOfEvents(startDate: LocalDate, endDate: LocalDate, recursion: Recursion): List<LocalDate>{
            var currentDate = startDate
            val listOfDates = mutableListOf<LocalDate>()
            while (currentDate.isBefore(endDate)) {
                listOfDates.add(currentDate)
                currentDate = startDate.plus(recursion.step, recursion.field)
            }
            return listOfDates
        }
    

    此方法使用递归步骤返回从 startDate 到 endDate 的日期列表。 如您所见,我为此使用了java.time.* 类,但最终您可以将它们转换为您自己的日期和递归并返回。 这里的 TemporalUnit 可以是DAYS, WEEKS, MONTHS, YEARS(和其他)。 它涵盖了您的大部分需求,您必须手动管理工作日。 希望这是有道理的)

    【讨论】:

      猜你喜欢
      • 2019-06-22
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多