Swift iOS开发:给定发车时间字符串数组,如何查找最近的下一班公交时间
解决方案
核心逻辑是遍历全部发车时间,分别计算每个时间在当前时刻之后的最近发车日期,再取最早的结果即为最近下一班车时间,修改后完整代码如下:
import UIKit let calendar = Calendar.current // 复用日期格式化器,避免重复创建带来的性能损耗 private let timeFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateFormat = "HH:mm" formatter.timeZone = .current return formatter }() var busTimes = ["15:02", "15:27", "15:52", "16:12", "16:37", "17:02", "17:27", "17:52", "18:12", "18:32", "18:52", "19:17"] @IBAction func calculateRoute(_ sender: Any) { let currentTime = Date() // 遍历所有发车时间,计算对应下一次发车日期,过滤无效值 let allValidNextDates = busTimes.compactMap { timeString in guard let timeDate = timeFormatter.date(from: timeString) else { return nil } let timeComponents = calendar.dateComponents([.hour, .minute], from: timeDate) return calendar.nextDate(after: currentTime, matching: timeComponents, matchingPolicy: .nextTime, direction: .forward) } // 取所有有效日期中最早的结果 guard let nextBusTime = allValidNextDates.min() else { print("无有效发车时间") return } // 格式化输出结果 timeFormatter.dateFormat = "HH:mm" print("最近下一班车时间:\(timeFormatter.string(from: nextBusTime))") }
逻辑说明
- 原代码只取了数组第一个元素计算,自然只能返回第一个时间的下一次发车结果,修改后遍历了全部发车时间
- 用
compactMap过滤无效时间,避免强行解包导致的崩溃问题 - 当当前时间超过当日所有班次时间时,
nextDate会自动返回次日的最早班次时间
如果不需要跨天取次日班次,可添加过滤逻辑,仅保留当日有效时间:
// 新增判断:仅保留和当前时间同一天的班次 let todayValidDates = allValidNextDates.filter { calendar.isDate($0, inSameDayAs: currentTime) } guard let nextBusTime = todayValidDates.min() else { print("今日所有班次已结束") return }
内容的提问来源于stack exchange,提问作者Filip Hudcovic
相关产品推荐
相关产品推荐

