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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:31