Swift技术咨询:如何获取两个日期之间的完整月份列表
解决日期区间内所有月份的列出需求
你之前的代码只能算出两个日期之间的总月份间隔,确实没法直接列出每个月份。要实现逐个输出从Feb 2016到Mar 2018的所有月份,咱们可以通过循环递增月份的方式来做,直接上可行的Swift代码方案:
// 定义起始和结束的年月组件(不用管具体日期,只关注年月) let startComponents = DateComponents(calendar: .current, year: 2016, month: 2) let endComponents = DateComponents(calendar: .current, year: 2018, month: 3) // 确保起始日期有效,取当月第一天 guard var currentDate = startComponents.date else { fatalError("起始日期组件无效,请检查输入的年月") } // 为了确保循环能包含结束月份,我们把结束日期设为结束月份的下一个月初 guard let endDate = Calendar.current.date(byAdding: .month, value: 1, to: endComponents.date!) else { fatalError("结束日期组件无效,请检查输入的年月") } // 设置日期格式化器,输出要求的"MMM yyyy"格式(比如Feb 2016) let dateFormatter = DateFormatter() dateFormatter.dateFormat = "MMM yyyy" dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 保证月份缩写是英文的,避免本地化影响 var resultMonths: [String] = [] // 循环递增月份,直到当前日期超过结束月份的下一个月初 while currentDate < endDate { resultMonths.append(dateFormatter.string(from: currentDate)) // 给当前日期加一个月,进入下一个月 currentDate = Calendar.current.date(byAdding: .month, value: 1, to: currentDate)! } // 输出结果,用逗号分隔 print(resultMonths.joined(separator: ", "))
代码说明:
- 我们直接基于年月组件来处理,避开具体日期的干扰——不管你起始日是2号还是20号,我们要的是整个月份的列表
- 把结束日期设为结束月份的下一个月初,这样循环会自然包含结束月份本身
- 使用
DateFormatter严格控制输出格式,通过en_US_POSIXlocale确保月份缩写是英文的(比如Feb而不是本地化的其他语言表述) - 循环中每次递增一个月,把格式化后的月份字符串存入数组,最后拼接成你需要的格式输出
运行这段代码后,就能得到你想要的结果:Feb 2016, Mar 2016, Apr 2016, ..., Jan 2018, Feb 2018, Mar 2018
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

