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

如何计算两个日期间的周日数量?需排除首日后不足7天的周日

计算两个日期间符合要求的周日数量(完整周数)

你的需求核心是统计两个日期之间的完整周数(即首个周日与起始日间隔不足7天时不统计,只算后续完整7天周期内的周日),原代码仅计算总天数无法满足需求,以下是实现方案:

实现思路

  1. 依赖系统日历处理日期计算,避免时区/地区周起始差异的影响
  2. 找到起始日期后第一个间隔≥7天的周日作为统计起点
  3. 计算该起点到结束日期之间包含多少个完整的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:58:21