Swift DateFormatter生成异常日期(日为86)问题排查求助
问题分析:日期格式字符串错误导致日期转换异常
嘿,这个问题我之前也踩过一模一样的坑!核心问题出在你写的DateFormatter日期格式上:
你用了formatter.dateFormat = "YYYY-MM-DD",这里的DD代表的是一年中的第几天(Day of Year),而不是我们需要的当月的第几天(Day of Month)。2022年3月27日正好是当年的第86天(1月31天+2月28天+27天),所以才会输出2022-03-86这种奇怪的结果。
除了这个核心错误,还有两个小细节需要优化:
- 你获取星期几的时候用的是
Date()(当前日期),而不是传入的dateToCheck——如果传入的不是当前日期,计算的偏移量就会出错 - 强制解包
date(byAdding:...)的!不太安全,极端情况下可能导致崩溃,建议用可选绑定处理
下面是修正后的完整代码:
func getStartAndEndOfWeek(_ dateToCheck: Date) { var sundayDiff = 0 var saturdayDiff = 0 let formatter = DateFormatter() formatter.locale = Locale(identifier: "en_US_POSIX") formatter.dateFormat = "yyyy-MM-dd" // 把DD改成dd,同时推荐用小写yyyy(公历年份)替代YYYY(周年年份) let calendar = Calendar.current // 这里改成从传入的dateToCheck获取星期几,而不是当前日期 let dayComponents = calendar.dateComponents([.weekday], from: dateToCheck) if let dayOfWeek = dayComponents.weekday { sundayDiff = dayOfWeek - 1 saturdayDiff = 7 - dayOfWeek } // 用可选绑定替代强制解包,避免潜在崩溃 if let sunday = calendar.date(byAdding: .day, value: -sundayDiff, to: dateToCheck), let saturday = calendar.date(byAdding: .day, value: saturdayDiff, to: dateToCheck) { let strSunday = formatter.string(from: sunday) let strSaturday = formatter.string(from: saturday) print("本周日:\(strSunday),本周六:\(strSaturday)") // 针对你给出的2022-03-30(周三),会输出:本周日:2022-03-27,本周六:2022-04-02 } }
最后补充两个容易混淆的日期格式知识点:
ddvsDD:dd是当月的第几天(范围01-31),DD是当年的第几天(范围001-366),一定要区分清楚yyyyvsYYYY:yyyy是标准的公历年份,YYYY是ISO周年的年份,只有在处理跨年周的时候才会有差异,日常开发用yyyy更稳妥
内容的提问来源于stack exchange,提问作者PruitIgoe




