Swift中如何生成两个日期间的30分钟时间间隔数组
在Swift中生成指定日期间30分钟间隔的时间数组
问题描述
需要生成两个给定日期之间,以30分钟为间隔的时间字符串数组,例如:
起始日期:20-08-2018 10:00 AM,结束日期:20-08-2018 02:30 PM
输出数组:["10:00 AM", "10:30 AM", "11:00 AM", "11:30 AM", "12:00 PM", "12:30 PM", "01:00 PM", "01:30 PM", "02:00 PM", "02:30 PM"]
优化实现方案
原代码逻辑存在冗余且有潜在出错风险(比如手动计算间隔数、重复修改日期组件),下面是更简洁健壮的实现:
import Foundation func generateThirtyMinuteIntervals(from startDate: Date, to endDate: Date) -> [String] { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "hh:mm a" dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 保证AM/PM格式不受系统区域影响 var intervals = [String]() var currentDate = startDate // 循环添加30分钟间隔,直到当前日期超出结束日期 while currentDate <= endDate { let timeString = dateFormatter.string(from: currentDate) intervals.append(timeString) // 每次添加30分钟(1800秒) currentDate = currentDate.addingTimeInterval(1800) } return intervals } // 测试示例 let inputFormatter = DateFormatter() inputFormatter.dateFormat = "dd-MM-yyyy hh:mm a" inputFormatter.locale = Locale(identifier: "en_US_POSIX") guard let startDate = inputFormatter.date(from: "20-08-2018 10:00 AM"), let endDate = inputFormatter.date(from: "20-08-2018 02:30 PM") else { fatalError("输入日期格式不正确") } let timeIntervals = generateThirtyMinuteIntervals(from: startDate, to: endDate) print(timeIntervals) // 输出:["10:00 AM", "10:30 AM", "11:00 AM", "11:30 AM", "12:00 PM", "12:30 PM", "01:00 PM", "01:30 PM", "02:00 PM", "02:30 PM"]
实现说明
- 统一日期格式化:用
DateFormatter处理所有日期与字符串的转换,指定en_US_POSIX本地化参数,避免系统区域设置导致的格式混乱。 - 可靠循环逻辑:从起始日期开始逐步累加30分钟,直到当前日期超过结束日期,确保所有间隔(包括结束日期本身)都被正确收录。
- 简化冗余操作:去掉原代码中手动计算间隔数量、重复修改日期组件的复杂逻辑,让代码更易读维护。
原代码的可优化点
- 手动计算
numberOfIntervals可能因时间差不是30分钟整数倍导致遗漏或多生成间隔,用while循环更稳妥。 - 拆分
timeArrayAM和timeArrayPM的操作没必要,最终合并为一个数组即可满足需求。 - 重复修改日期年/月/日组件的逻辑可以简化,若仅需比较时间,直接提取时间组件对比即可。
内容的提问来源于stack exchange,提问作者Vipul Kumar
相关产品推荐
相关产品推荐

