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

