android 使列表充满避免特定时间框架的时隙

bzzcjhmw  于 2022-12-21  发布在  Android
关注(0)|答案(2)|浏览(114)

我尝试制作一个列表,默认情况下包含从一个时间点到另一个时间点的可用时隙列表。它必须避免在特定的时间范围内制作时隙。
例如:我的第一个时间点是09:00,结束时间点是17:00。时隙的持续时间是15。只是有时候我不能在特定的时间范围内有任何时间时隙。例如,可以是从12:00到12:30。
因此,最终应该用09:00到12:00以及12:30到17:00的TimeSlots来填充这些插槽。这是我目前使用的代码,我使用的是java.time.LocalTime。目前为止,它运行得不是很好...谢谢您的关注!

data class TimeSlot(
    val startTime: LocalTime,
    val endTime: LocalTime,
)
private fun initializeSlots(
    slots: ArrayList<TimeSlot>,
    startTimeShift: LocalTime,
    appointmentDuration: Long,
    amountOfWorkingHours: Long,
    breakTime: LocalTime,
    breakDuration: Long
) {
    slots.add(TimeSlot(startTime = startTimeShift, endTime = startTimeShift.plusMinutes(appointmentDuration)))
    val possibleTotalAppointments = (amountOfWorkingHours * appointmentDuration) - 2 // -2 because index starts at 0 and first timeslot is already added.
    for (i in 0..(amountOfWorkingHours * appointmentDuration).toInt()) {
        if (slots[i].endTime == breakTime) {
            val endTimeOfBreak = breakTime.plusMinutes(breakDuration)
            val isTargetWithinTimeFrame = (!breakTime.isBefore(slots[i].startTime) && breakTime.isBefore(endTimeOfBreak))
            if (isTargetWithinTimeFrame) {
                slots.remove(slots[i])
                continue
            }
        } else {
            slots.add(TimeSlot(startTime = slots[i].endTime, endTime = slots[i].endTime.plusMinutes(appointmentDuration)))
        }
    }
}
wbgh16ku

wbgh16ku1#

如果你的时间段是静态的(总是从09:00到17:00,持续时间总是15分钟),你实际上可以将它们硬编码到一个数组中,并通过索引进一步操作。所以,例如,如果每小时有4个索引从0开始,你的特定时间段12:00到12:30将有索引12,13,14。这样的代码不会太漂亮,但仍然更具可读性。
无论如何,LocalTime总的来说不是最好的主意。我只想使用Long,并使用System.currentTimeMillis()。这是处理时区的最佳解决方案(只为UI格式化时区,而不是为逻辑格式化时区)。而且,它还将使时间计算变得更容易,因为实际上可以对毫秒进行除法和减法。

bpzcxfmw

bpzcxfmw2#

我用了另一种方法来寻找答案,所以如果有人遇到同样的问题,这里有。你也可以给予多个时间框架,你想避免。随意改变它的任何方式。它也可以返回对,而不是'时隙的。

fun generateTimeSlots(
        startTime: LocalTime,
        endTime: LocalTime,
        duration: Long,
        avoid: List<TimeSlot>
    ): List<TimeSlot> {
        val timeSlots = mutableListOf<TimeSlot>()
        var currentTime = startTime

        while (currentTime < endTime) {
            val nextTime = currentTime.plusMinutes(duration)
            val timeSlot = TimeSlot(currentTime, nextTime)

            if (avoid.none { timeSlot.startTime in it.startTime..it.endTime.minusMinutes(1) }) {
                timeSlots.add(timeSlot)
            }

            currentTime = nextTime
        }

        return timeSlots
    }

相关问题