我尝试制作一个列表,默认情况下包含从一个时间点到另一个时间点的可用时隙列表。它必须避免在特定的时间范围内制作时隙。
例如:我的第一个时间点是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)))
}
}
}
2条答案
按热度按时间wbgh16ku1#
如果你的时间段是静态的(总是从09:00到17:00,持续时间总是15分钟),你实际上可以将它们硬编码到一个数组中,并通过索引进一步操作。所以,例如,如果每小时有4个索引从0开始,你的特定时间段12:00到12:30将有索引12,13,14。这样的代码不会太漂亮,但仍然更具可读性。
无论如何,LocalTime总的来说不是最好的主意。我只想使用Long,并使用System.currentTimeMillis()。这是处理时区的最佳解决方案(只为UI格式化时区,而不是为逻辑格式化时区)。而且,它还将使时间计算变得更容易,因为实际上可以对毫秒进行除法和减法。
bpzcxfmw2#
我用了另一种方法来寻找答案,所以如果有人遇到同样的问题,这里有。你也可以给予多个时间框架,你想避免。随意改变它的任何方式。它也可以返回对,而不是'时隙的。