如何计算每X个多日期组件发生的事件的最近事件的日期?

时间:2017-02-10 17:04:07

标签: date cocoa nscalendar

假设我有一个重复发生的事件,每个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的日期功能有更好的方法吗?

0 个答案:

没有答案