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

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_POSIX locale确保月份缩写是英文的(比如Feb而不是本地化的其他语言表述)
  • 循环中每次递增一个月,把格式化后的月份字符串存入数组,最后拼接成你需要的格式输出

运行这段代码后,就能得到你想要的结果:Feb 2016, Mar 2016, Apr 2016, ..., Jan 2018, Feb 2018, Mar 2018

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:15:07