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
相关产品推荐
相关产品推荐

