You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 16:09:03