假设我有一个重复发生的事件,每个X组件都会发生,其中'组件'是DateComponents
,其中定义了多个单元,例如“每三天两小时”或“每隔一年”一天'。
示例
- 首次活动日期:
2015-02-27
- 事件之间的间隔:
2 years, 1 day
(a.k.a。'隔年和每一天')
计算初始事件中的下一个事件列表非常简单,只需要创建初始事件的Date
和描述经常性事件的DateComponents
,您就可以轻松找到第n个日期:
let calendar = Calendar(identifier: .gregorian)
let initialEventDate = calendar.date(from: DateComponents(year: 2015, month: 02, day: 27))!
let eventInterval = DateComponents(year: 2, day: 1)
// Returns the date of the nth event
let eventDate = { (n: Int) -> Date in
return calendar.date(byAdding: eventInterval * n, to: initialEventDate)!
}
请注意,上面使用自定义运算符*
将所有组件乘以给定的整数。
以上回报正是我想要的:
- 0→2015-02-27
- 1→2017-02-28
- 2→2019-03-01
- 3→2021-03-02
等等
问题是,如何在其他日期找到最后一个事件的日期?或者用另一种方式表达,如何反向实现(即找到给定日期的 n )?
例如,如果我的日期为2017-06-21
,则 n 是介于1和2之间的数字,但在我的情况下,我只对舍入感兴趣n 找到最后一个事件的日期。然而,如果给定日期在事件开始日期之前,我就能够获得 n 的负值,这一点非常重要,就好像事件一直发生以及事件开始日期只是定义偏移量的'示例'日期。
最初,我想到计算给定日期和初始事件日期之间的组件数量(仅询问作为区间定义一部分的组件),并将结果组件潜移到区间定义中的组件并向下舍入,但很快就发现这不起作用。
我能想到的另一种方法是猜测和检查。使用Apple的日期功能有更好的方法吗?