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
相关产品推荐
相关产品推荐

