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

SwiftUI开发:如何获取两个日期之间的逐小时时间数组

逐小时时间点数组实现方案

问题背景

  • 开发场景:SwiftUI 应用需从给定日期区间提取逐小时时间节点,通过 ForEach 渲染列表
  • 测试区间:09.12.2022 09:00 - 09.13.2022 09:00,预期输出格式为09:00、10:00逐小时递增到结束时间的序列
  • 原有代码缺陷:仅计算起止时间的小时差值,未生成可用的时间点序列

修改后代码

核心逻辑是从起始时间开始,每次按1小时偏移累加,直到到达结束时间,过程中收集每一个时间点并格式化为目标格式。

func getHourlyTimePoints(times: String) -> [String] {
    let timeParts = times.components(separatedBy: "-")
    let inputFormatter = DateFormatter()
    inputFormatter.dateFormat = "MM.dd.yyyy HH:mm"
    
    // 解析起止时间,兼容分隔符前后带空格的输入,异常输入返回空数组
    guard let startDate = inputFormatter.date(from: timeParts[0].trimmingCharacters(in: .whitespaces)),
          let endDate = inputFormatter.date(from: timeParts[1].trimmingCharacters(in: .whitespaces)) else {
        return []
    }
    
    let calendar = Calendar.current
    var result: [String] = []
    // 输出格式配置,仅保留小时和分钟
    let outputFormatter = DateFormatter()
    outputFormatter.dateFormat = "HH:mm"
    
    var current = startDate
    while current <= endDate {
        result.append(outputFormatter.string(from: current))
        // 时间加1小时
        guard let next = calendar.date(byAdding: .hour, value: 1, to: current) else { break }
        current = next
    }
    
    return result
}

使用说明

  • 调用方法:直接传入原格式的时间区间字符串即可得到格式化好的字符串数组,传入ForEach使用示例:
let hourlyList = getHourlyTimePoints(times: "09.12.2022 09:00-09.13.2022 09:00")

// SwiftUI 视图中渲染
ForEach(hourlyList, id: \.self) { timeStr in
    Text(timeStr)
}
  • 自定义调整:
    • 不需要包含结束时间点时,将循环判断条件current <= endDate改为current < endDate即可
    • 需要保留完整Date对象做后续计算时,删除输出格式化逻辑,函数返回值改为[Date],直接将current存入结果数组即可
    • 需要其他输出格式时,修改outputFormatter.dateFormat的格式字符串即可

内容的提问来源于stack exchange,提问作者Dave Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:06:21