Swift-添加N个月至今 [英] Swift - Add N month to date

查看:50
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆