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

Swift获取墨西哥地区周一至周日周范围的配置问题求解

Swift 周数计算配置问题修复

核心错误点

  • 构造周日期组件时,你使用了普通自然年的year参数,而周历计算对应的是yearForWeekOfYear,两者在跨年周场景下取值不同,会直接导致周数匹配错误
  • 未显式指定日历的地区与时区,系统默认的地区配置可能会覆盖你设置的周起始、最小天数规则
  • 周结束日期计算逻辑错误:加7天会得到下一周的起始日期,正确的当周结束应为起始日期加6天

修正后可运行代码

var weekNumber: Int = 0
var calendar = Calendar(identifier: .gregorian)
// 显式指定墨西哥地区、时区,避免系统默认配置冲突
calendar.locale = Locale(identifier: "es_MX")
calendar.timeZone = TimeZone(identifier: "America/Mexico_City")!
// 1对应周日,2对应周一,设置周一为周起始
calendar.firstWeekday = 2
calendar.minimumDaysInFirstWeek = 4

// 测试用2021年9月15日,属于预期的第37周
let targetDate = calendar.date(from: DateComponents(year: 2021, month: 9, day: 15))!
// 取周历对应的年份,而非普通自然年
let weekYear = calendar.component(.yearForWeekOfYear, from: targetDate)
weekNumber = calendar.component(.weekOfYear, from: targetDate)

print("weekNumber", weekNumber) // 输出:37,符合预期
let startComponents = DateComponents(weekOfYear: weekNumber, yearForWeekOfYear: weekYear)
let startDate = calendar.date(from: startComponents)!
// 当周周日为起始+6天,若需要取当周最后一刻可再加23小时59分59秒
let endDate = calendar.date(byAdding: .day, value: 6, to: startDate)!

print("startDate", startDate) // 输出墨西哥当地时间 2021-09-13 00:00:00 -0500
print("endDate", endDate) // 输出墨西哥当地时间 2021-09-19 00:00:00 -0500

打印输出的日期如果显示为UTC时间,只需在打印前用DateFormatter指定对应时区转换即可展示为当地时间格式。

内容的提问来源于stack exchange,提问作者Laura Ramírez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:24:05