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

Swift中为Date添加月份值时日期计算结果异常问题及解决

问题描述

我在开发过程中遇到一个问题:我通过如下函数获取当前年份的起始日期:

func startOfYear() -> Date {
    var calendar = Calendar(identifier: .iso8601)
    let timezone = TimeZone(secondsFromGMT: 0)!
    calendar.timeZone = timezone
    return calendar.dateComponents([.calendar, .year], from: self).date!
}

我的目标是基于该日期遍历提取每个自然月的数据,因此编写了如下函数,通过给.month分量叠加数值的方式获取当年每个月的起始日期:

func getNextMonths(using calendar: Calendar = .iso8601, monthAmount: Int) -> Date {
    calendar.date(byAdding: .month, value: monthAmount, to: self.startOfYear())!
}

我编写了如下测试代码,遍历调用该函数并打印日期:

func getMonth() {
    for number in 0...12 {
        print("month \(number): \(Date().getNextMonths(monthAmount: number))")
    }
}

运行后得到的输出如下:

month 0: 2022-01-01 00:00:00 +0000
month 1: 2022-02-01 00:00:00 +0000
month 2: 2022-03-01 00:00:00 +0000
month 3: 2022-03-31 23:00:00 +0000
month 4: 2022-04-30 23:00:00 +0000
month 5: 2022-05-31 23:00:00 +0000
month 6: 2022-06-30 23:00:00 +0000
month 7: 2022-07-31 23:00:00 +0000
month 8: 2022-08-31 23:00:00 +0000
month 9: 2022-09-30 23:00:00 +0000
month 10: 2022-11-01 00:00:00 +0000
month 11: 2022-12-01 00:00:00 +0000
month 12: 2023-01-01 00:00:00 +0000

从输出可以看到,从month 3开始结果出现异常:预期应返回2022-04-01 00:00:00 +0000,实际返回2022-03-31 23:00:00 +0000,我不清楚代码哪里编写有误,无法得到预期结果。

修复方案

编辑补充
感谢Joakim Danielson的帮助,我修改了getNextMonths函数适配夏令时判断后功能已正常运行,虽然方案比较简陋但可满足需求,修改后的代码如下:

func getNextMonths(using calendar: Calendar = .iso8601, monthAmount: Int) -> Date {
    if monthAmount == 0 || monthAmount == 1 || monthAmount == 2 || monthAmount == 10 || monthAmount == 11 || monthAmount == 12 {
        return calendar.date(byAdding: .month, value: monthAmount, to: self.startOfYear())!
    } else {
        var dateComponents = DateComponents()
        dateComponents.month = monthAmount
        dateComponents.hour = 1
        return calendar.date(byAdding: dateComponents, to: self.startOfYear())!
    }
}

内容的提问来源于stack exchange,提问作者Kamil Skrzyński

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:39:13