Swift-添加N个月至今 [英] Swift - Add N month to date
本文介绍了Swift-添加N个月至今的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用以下代码在两个日期之间生成日期。它适用于月份中的日期少于 28
的所有情况。
I have used the following code to generate dates between two dates. It works in all cases where the day of the month is less than 28
.
extension Date {
public func addMonth(n: Int) -> Date {
let calendar = Calendar.current
return calendar.date(byAdding: .month, value: n, to: self)!
}
public func addYear(n: Int) -> Date {
let calendar = Calendar.current
return calendar.date(byAdding: .year, value: n, to: self)!
}
public var monthName: String {
let calendar = Calendar.current
let monthInt = calendar.component(.month, from: self)
return calendar.monthSymbols[monthInt-1]
}
}
var date = Date()
repeat {
date = date.addMonth(n: 1)
print("\(date) \(date.monthName) ")
} while date <= Date().addYear(n: 2)
结果
2020-07-30 13:31:14 +0000 July
2020-08-30 13:31:14 +0000 August
2020-09-30 13:31:14 +0000 September
2020-10-30 14:31:14 +0000 October
2020-11-30 14:31:14 +0000 November
2020-12-30 14:31:14 +0000 December
2021-01-30 14:31:14 +0000 January
2021-02-28 14:31:14 +0000 February
2021-03-28 13:31:14 +0000 March
2021-04-28 13:31:14 +0000 April
2021-05-28 13:31:14 +0000 May
2021-06-28 13:31:14 +0000 June
2021-07-28 13:31:14 +0000 July
2021-08-28 13:31:14 +0000 August
2021-09-28 13:31:14 +0000 September
2021-10-28 13:31:14 +0000 October
2021-11-28 14:31:14 +0000 November
2021-12-28 14:31:14 +0000 December
2022-01-28 14:31:14 +0000 January
2022-02-28 14:31:14 +0000 February
2022-03-28 13:31:14 +0000 March
2022-04-28 13:31:14 +0000 April
2022-05-28 13:31:14 +0000 May
2022-06-28 13:31:14 +0000 June
2022-07-28 13:31:14 +0000 July
预期结果
我希望结果是28或30。
Expected result
I expect the result to be either 28 or 30.
2020-07-30 13:31:14 +0000 July
2020-08-30 13:31:14 +0000 August
2020-09-30 13:31:14 +0000 September
2020-10-30 14:31:14 +0000 October
2020-11-30 14:31:14 +0000 November
2020-12-30 14:31:14 +0000 December
2021-01-30 14:31:14 +0000 January
2021-02-28 14:31:14 +0000 February
2021-03-30 13:31:14 +0000 March
2021-04-30 13:31:14 +0000 April
2021-05-30 13:31:14 +0000 May
2021-06-30 13:31:14 +0000 June
2021-07-30 13:31:14 +0000 July
2021-08-30 13:31:14 +0000 August
2021-09-30 13:31:14 +0000 September
2021-10-30 13:31:14 +0000 October
2021-11-30 14:31:14 +0000 November
2021-12-30 14:31:14 +0000 December
2022-01-30 14:31:14 +0000 January
2022-02-28 14:31:14 +0000 February
2022-03-30 13:31:14 +0000 March
2022-04-30 13:31:14 +0000 April
2022-05-30 13:31:14 +0000 May
2022-06-30 13:31:14 +0000 June
2022-07-30 13:31:14 +0000 July
日历是否具有实现此目的的内置功能?
Does Calendar has built-in functionality to achieve this?
推荐答案
您可以使用日历方法 nextDate(after:)
传递previousTimePreservingSmallerComponents作为matchingPolicy:
You can use Calendar method nextDate(after:)
passing previousTimePreservingSmallerComponents as the matchingPolicy:
public extension Date {
func noon(using calendar: Calendar = .current) -> Date {
calendar.date(bySettingHour: 12, minute: 0, second: 0, of: self)!
}
func day(using calendar: Calendar = .current) -> Int {
calendar.component(.day, from: self)
}
func adding(_ component: Calendar.Component, value: Int, using calendar: Calendar = .current) -> Date {
calendar.date(byAdding: component, value: value, to: self)!
}
func monthSymbol(using calendar: Calendar = .current) -> String {
calendar.monthSymbols[calendar.component(.month, from: self)-1]
}
}
var date = Date().noon() // "Jun 30, 2020 at 12:00 PM"
let day = date.day()
let endDate = date.adding(.year, value: 2)
repeat {
date = Calendar.current.nextDate(after: date, matching: DateComponents(day: day, hour: 12), matchingPolicy: .previousTimePreservingSmallerComponents)!
print(date.description(with: .current), date.monthSymbol())
} while date <= endDate
这将打印:
Thursday, July 30, 2020 at 12:00:00 PM Brasilia Standard Time July
Sunday, August 30, 2020 at 12:00:00 PM Brasilia Standard Time August
Wednesday, September 30, 2020 at 12:00:00 PM Brasilia Standard Time September
Friday, October 30, 2020 at 12:00:00 PM Brasilia Standard Time October
Monday, November 30, 2020 at 12:00:00 PM Brasilia Standard Time November
Wednesday, December 30, 2020 at 12:00:00 PM Brasilia Standard Time December
Saturday, January 30, 2021 at 12:00:00 PM Brasilia Standard Time January
Sunday, February 28, 2021 at 12:00:00 PM Brasilia Standard Time February
Tuesday, March 30, 2021 at 12:00:00 PM Brasilia Standard Time March
Friday, April 30, 2021 at 12:00:00 PM Brasilia Standard Time April
Sunday, May 30, 2021 at 12:00:00 PM Brasilia Standard Time May
Wednesday, June 30, 2021 at 12:00:00 PM Brasilia Standard Time June
Friday, July 30, 2021 at 12:00:00 PM Brasilia Standard Time July
Monday, August 30, 2021 at 12:00:00 PM Brasilia Standard Time August
Thursday, September 30, 2021 at 12:00:00 PM Brasilia Standard Time September
Saturday, October 30, 2021 at 12:00:00 PM Brasilia Standard Time October
Tuesday, November 30, 2021 at 12:00:00 PM Brasilia Standard Time November
Thursday, December 30, 2021 at 12:00:00 PM Brasilia Standard Time December
Sunday, January 30, 2022 at 12:00:00 PM Brasilia Standard Time January
Monday, February 28, 2022 at 12:00:00 PM Brasilia Standard Time February
Wednesday, March 30, 2022 at 12:00:00 PM Brasilia Standard Time March
Saturday, April 30, 2022 at 12:00:00 PM Brasilia Standard Time April
Monday, May 30, 2022 at 12:00:00 PM Brasilia Standard Time May
Thursday, June 30, 2022 at 12:00:00 PM Brasilia Standard Time June
Saturday, July 30, 2022 at 12:00:00 PM Brasilia Standard Time July
编辑/更新:
edit/update:
如果需要每n个月:
var date = Date().noon() // "Jun 30, 2020 at 12:00 PM"
let day = date.day()
let endDate = date.adding(.year, value: 2)
var dates: [Date] = []
let nthMonth = 3
var counter = 0
repeat {
counter += 1
date = Calendar.current.nextDate(after: date, matching: DateComponents(day: day, hour: 12), matchingPolicy: .previousTimePreservingSmallerComponents)!
if counter.isMultiple(of: nthMonth) {
dates.append(date)
print(date.description(with: .current), date.monthSymbol())
}
} while date <= endDate
这将打印:
This will print:
Wednesday, September 30, 2020 at 12:00:00 PM Brasilia Standard Time September
Wednesday, December 30, 2020 at 12:00:00 PM Brasilia Standard Time December
Tuesday, March 30, 2021 at 12:00:00 PM Brasilia Standard Time March
Wednesday, June 30, 2021 at 12:00:00 PM Brasilia Standard Time June
Thursday, September 30, 2021 at 12:00:00 PM Brasilia Standard Time September
Thursday, December 30, 2021 at 12:00:00 PM Brasilia Standard Time December
Wednesday, March 30, 2022 at 12:00:00 PM Brasilia Standard Time March
Thursday, June 30, 2022 at 12:00:00 PM Brasilia Standard Time June
这篇关于Swift-添加N个月至今的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文