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

Swift生成指定星期几对应未来一月所有日期的实现问题

问题原因
  • 你的DateComponents配置不完整:仅指定年、月、星期三个属性,日历系统无法定位到唯一的有效日期,解析失败后返回了异常值,你看到的2021-07-31 23:00:00 +0000就是解析错误的结果。
  • 系统Calendar的weekday规则和你理解的有偏差:苹果官方定义中周日对应1、周一对应2、周二对应3,以此类推到周六对应7,如果你的WorkDay.weekDay是按周一=1定义的,需要先做值的转换。
  • 现有逻辑每个规则仅生成1次日期,无法覆盖一个月内所有符合条件的日期。
修复后的实现方案

实现思路是先确定未来一个月的时间范围,再通过日历自带的遍历方法找出范围内所有匹配指定星期的日期:

// 假设你已经定义了WorkDay结构
struct WorkDay {
    let weekDay: Int
    let startTime: Int
    let endTime: Int
    let busyHours: [Int]
}

var masterSchedule = [
    WorkDay(weekDay: 1, startTime: 8, endTime: 16, busyHours: []),
    WorkDay(weekDay: 4, startTime: 8, endTime: 16, busyHours: [])
]
var availableDays: [Date] = []

func getDatesForNextMonth() {
    // 清空原有结果
    availableDays.removeAll()
    let calendar = Calendar.current
    // 配置当前时区避免日期偏移
    var calendarWithTimeZone = calendar
    calendarWithTimeZone.timeZone = .current
    
    // 计算未来一个月的时间范围:从今天开始到1个月后的同一天
    let startDate = Date()
    guard let endDate = calendarWithTimeZone.date(byAdding: .month, value: 1, to: startDate) else { return }
    
    // 遍历每个排班规则
    for workDay in masterSchedule {
        // 转换weekday为系统规则:如果你的workDay.weekDay是周一=1,加1得到系统的周一=2
        // 如果你本身就是按系统规则(周日=1)定义的weekDay,直接用workDay.weekDay即可
        let systemWeekDay = workDay.weekDay + 1
        
        // 遍历时间范围内所有匹配对应星期的日期
        calendarWithTimeZone.enumerateDates(
            startingAfter: startDate,
            matching: DateComponents(weekday: systemWeekDay),
            matchingPolicy: .nextTime
        ) { date, _, stop in
            guard let date = date, date < endDate else {
                stop = true
                return
            }
            availableDays.append(date)
        }
    }
    
    // 可选:按日期升序排序结果
    availableDays.sort()
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:00