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
相关产品推荐
相关产品推荐

