如何修复Kotlin工作时间函数,实现日期区间完整映射?
修复工作时间映射函数问题
问题说明
当前实现的getWorkingHours()函数无法正确处理API返回的日期范围格式(如"Sun - Thu:8:00 am-8:00 pm"),仅能匹配范围两端的日期,中间的周一、周二、周三会被错误标记为Closed,不符合预期输出。
错误根源
原代码使用day in dayRange的字符串包含判断,这种方式只能识别直接出现在dayRange字符串中的日期缩写(比如Sun和Thu),无法解析Sun - Thu这种范围所覆盖的所有中间日期。
修复后的代码
fun getWorkingHours(): Map<String, String> { val branches = libraryBranchesLiveData.value!! val hoursByDay: MutableMap<String, String> = mutableMapOf() val daysOrder = listOf("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") // 初始化所有日期为Closed daysOrder.forEach { day -> hoursByDay[day] = "Closed" } val branchOpenedTimes = branches[selectedBranchIdPositionInList].opened_time ?: return hoursByDay if (branchOpenedTimes.isEmpty()) return hoursByDay // 遍历每个时间规则 branchOpenedTimes.forEach { workingHour -> val parts = workingHour.split(":", limit = 2) val dayPart = parts[0].trim() val hours = parts[1].trim() // 判断是单个日期还是日期范围 if (dayPart.contains("-")) { // 处理日期范围,比如 "Sun - Thu" val rangeParts = dayPart.split("-").map { it.trim() } val startDay = rangeParts[0] val endDay = rangeParts[1] val startIndex = daysOrder.indexOf(startDay) val endIndex = daysOrder.indexOf(endDay) // 遍历范围内的所有日期 if (startIndex != -1 && endIndex != -1) { for (i in startIndex..endIndex) { hoursByDay[daysOrder[i]] = hours } } } else { // 处理单个日期,比如 "Fri" if (daysOrder.contains(dayPart)) { hoursByDay[dayPart] = hours } } } return hoursByDay }
修复说明
- 初始化默认值:先把所有日期的工作时间设为
Closed,避免遗漏未匹配的日期(比如示例中的Sat)。 - 解析日期范围:通过判断
dayPart是否包含-来区分单个日期和范围,对于范围,找到起始和结束日期在daysOrder中的索引,然后遍历索引区间内的所有日期,设置对应的工作时间。 - 简化逻辑:去掉冗余的StringBuilder拼接(当前场景下一个日期只会对应一组时间),直接覆盖默认的
Closed值。
验证效果
当API返回["Sun - Thu:8:00 am-8:00 pm","Fri:8:00 am-12:00 pm"]时,函数输出将符合预期:
Sun = 8:00 am-8:00 pm Mon = 8:00 am-8:00 pm Tue = 8:00 am-8:00 pm Wed = 8:00 am-8:00 pm Thu = 8:00 am-8:00 pm Fri = 8:00 am-12:00 pm Sat = Closed
内容的提问来源于stack exchange,提问作者Ali Haider
相关产品推荐
相关产品推荐

