You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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
    }
}

最后补充两个容易混淆的日期格式知识点:

  • dd vs DDdd是当月的第几天(范围01-31),DD是当年的第几天(范围001-366),一定要区分清楚
  • yyyy vs YYYYyyyy是标准的公历年份,YYYY是ISO周年的年份,只有在处理跨年周的时候才会有差异,日常开发用yyyy更稳妥

内容的提问来源于stack exchange,提问作者PruitIgoe

火山引擎 最新活动