如何获取当前年份中包含每月1号的周数集合?
实现方案
核心思路直接明确:遍历当年每个月份的1号,获取每个1号对应的当年周数,将这些周数存入Set即可。以下是结合你现有代码的具体实现:
扩展Date功能
在你已有的Date扩展基础上,新增两个关键方法:
extension Date { // 你已有的扩展代码 func getStart(of component: Calendar.Component, calendar: Calendar = Calendar.current) -> Date? { return calendar.dateInterval(of: component, for: self)?.start } func getEnd(of component: Calendar.Component, calendar: Calendar = Calendar.current) -> Date? { return calendar.dateInterval(of: component, for: self)?.end } // 新增:获取当年所有月份的1号日期数组 func getAllMonthFirstDaysOfCurrentYear(calendar: Calendar = Calendar.current) -> [Date] { guard let yearStart = getStart(of: .year, calendar: calendar) else { return [] } var monthFirstDays = [Date]() for month in 1...12 { var components = calendar.dateComponents([.year, .month], from: yearStart) components.month = month components.day = 1 if let monthFirstDay = calendar.date(from: components) { monthFirstDays.append(monthFirstDay) } } return monthFirstDays } // 新增:获取日期对应的当年周数 func getWeekOfYear(calendar: Calendar = Calendar.current) -> Int? { return calendar.dateComponents([.weekOfYear], from: self).weekOfYear } }
生成目标Set集合
调用扩展方法,收集所有包含月首的周数:
// 示例:获取当前年份的目标Set let currentDate = Date() // 注意:周起始日(如周一/周日)会影响周数计算,可根据需求配置Calendar let calendar = Calendar.current let monthFirstDays = currentDate.getAllMonthFirstDaysOfCurrentYear(calendar: calendar) var weekSet = Set<Int>() for day in monthFirstDays { if let weekOfYear = day.getWeekOfYear(calendar: calendar) { weekSet.insert(weekOfYear) } } print(weekSet) // 2023年输出类似 {1,5,9,13,17,22,26,30,34,38,43,47}
关键注意点
- 统一Calendar配置:必须使用同一个
Calendar实例完成所有日期计算,避免因周起始日、年份周数规则不同导致结果偏差。如需符合ISO 8601标准,可手动配置:var calendar = Calendar.current calendar.firstWeekday = 2 // 设置周一为周起始日 calendar.minimumDaysInFirstWeek = 4 // 规定第一周至少包含4天 - 复用现有扩展:你的
getStart(of: .year)方法用于精准定位当年起始日期,确保生成的所有月首日期都属于当前年份。
内容的提问来源于stack exchange,提问作者BSR
相关产品推荐
相关产品推荐

