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

如何获取当前年份中包含每月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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:57:05