如何计算两个日期间的周日数量?需排除首日后不足7天的周日
计算两个日期间符合要求的周日数量(完整周数)
你的需求核心是统计两个日期之间的完整周数(即首个周日与起始日间隔不足7天时不统计,只算后续完整7天周期内的周日),原代码仅计算总天数无法满足需求,以下是实现方案:
实现思路
- 依赖系统日历处理日期计算,避免时区/地区周起始差异的影响
- 找到起始日期后第一个间隔≥7天的周日作为统计起点
- 计算该起点到结束日期之间包含多少个完整的7天周期(即周日数量)
Swift 代码实现
let date1 = datePicker.date let date2 = Date() // 初始化日历并设置时区(避免时区偏差,可根据需求调整为系统时区) var calendar = Calendar.current calendar.timeZone = TimeZone(identifier: "UTC") ?? calendar.timeZone // 若起始日期晚于结束日期,直接返回0 guard date1 <= date2 else { print("符合条件的周日数量:0") return } // 获取当前日历中周日对应的weekday值(适配不同地区周起始设置) let sundayWeekday: Int if let sundayIndex = calendar.weekdaySymbols.firstIndex(of: "Sunday") { sundayWeekday = sundayIndex + 1 } else { // fallback:默认周日为1(适配大部分地区) sundayWeekday = 1 } // 找到date1之后的第一个周日 var targetStartSunday = calendar.nextDate(after: date1, matching: DateComponents(weekday: sundayWeekday), matchingPolicy: .nextTime) ?? date1 // 检查第一个周日与date1的间隔是否小于7天,若是则跳过该周日 let daysToFirstSunday = calendar.dateComponents([.day], from: date1, to: targetStartSunday).day ?? 0 if daysToFirstSunday < 7 { targetStartSunday = calendar.date(byAdding: .day, value: 7, to: targetStartSunday) ?? targetStartSunday } // 若目标起始周日已超过结束日期,返回0 guard targetStartSunday <= date2 else { print("符合条件的周日数量:0") return } // 计算符合条件的周日总数 let totalDaysBetween = calendar.dateComponents([.day], from: targetStartSunday, to: date2).day ?? 0 let validSundayCount = totalDaysBetween / 7 + 1 print("符合条件的周日数量:\(validSundayCount)")
代码说明
- 时区设置:可根据业务需求替换为
TimeZone.autoupdatingCurrent使用系统时区,避免UTC带来的日期偏移 - 周日适配:通过
weekdaySymbols获取周日对应的索引,兼容不同地区的周起始设置(比如欧洲部分地区周一为一周第一天) - 边界处理:覆盖了起始日晚于结束日、第一个周日超过结束日等异常情况
内容的提问来源于stack exchange,提问作者JOHNY
相关产品推荐
相关产品推荐

