【问题标题】:Get all NSDates BETWEEN startDate and endDate获取 startDate 和 endDate 之间的所有 NSDates
【发布时间】:2011-03-08 16:35:27
【问题描述】:

我的问题是典型的“我如何确定 NSDate 是否在 startDate 和 endDate 之间?”的反向问题

我想要做的是找到在 startDate 和 endDate 之间发生的所有 NSDATES(到一天,而不是小时或分钟)。最好包含这些日期,尽管不是必须的。

示例: (我知道这些不代表NSDate,这些只是为了说明)

输入: 开始日期 = 10 年 6 月 23 日 20:11:30 endDate = 6/27/10 02:15:00

输出: NSArray:6/23/10、6/24/10、6/25/10、6/26/10、6/27/10

我不介意做这项工作。只是在编写高效代码方面我不知道从哪里开始,而不必一点一点地通过 NSDates。

【问题讨论】:

    标签: iphone objective-c nsdate


    【解决方案1】:

    自从 OS X 10.9 和 iOS 8.0 以来,就有以下非常干净的方法来做到这一点。它还处理月末跳跃。

    let cal = NSCalendar.currentCalendar()
    let start = NSDate()
    let end = // some end date
    
    var next = start
    while !cal.isDate(next, inSameDayAsDate: end) {
        next = cal.dateByAddingUnit(.Day, value: 1, toDate: next, options: [])!
        // do something with `next`
    }
    

    请注意,对于较旧的操作系统版本,-isDate:inSameDayAsDate: 可以通过一些调用来替换,例如-components:fromDate:toDate:options:-dateByAddingUnit:value:toDate:options: 可以替换为 dateByAddingComponents:toDate:options:

    【讨论】:

      【解决方案2】:

      使用NSCalendar 实例将您的起始NSDate 实例转换为NSDateComponents 实例,将NSDateComponents 加1 天,然后使用NSCalendar 将其转换回NSDate 实例。重复最后两个步骤,直到您到达结束日期。

      【讨论】:

      • 这也有效,但比drawonward的解决方案有点混乱。
      • 梅西耶?没有。更正确?是的。 Drawnonward 的解决方案没有考虑到任何因日历特性而可能出现的问题,例如夏令时等。使用NSCalendar 当然是 Apple 推荐的方式。
      • NSCalendar 对于连续几天来说太过分了。中午开始日期包括夏令时。直到您迭代 30000 闰秒并且只有 24 个闰秒之前,天可能比 24 小时差一秒这一事实并不重要。闰日是 24 小时。使用 NSCalendar 会给简单的任务增加不必要的复杂性。
      • 好吧,在这种情况下你也许可以侥幸逃脱,但一般来说,放弃 NSCalendar 路线是个坏习惯。
      • 我也想使用 NSCalendar 方法,但是如果我遍历开始日期(例如 2012-01-28 到 2012-02-03)会发生什么?在将 NSDateComponents 的日期值设置为 Jan 31 的最大值后,我应该如何设置它?我可以将组件的日期值设置为 32 吗?或者我应该智能地将日期设置为 1 并将月份设置为 2?
      【解决方案3】:

      将开始日期加上 24 小时,直到超过结束日期。

      for ( nextDate = startDate ; [nextDate compare:endDate] < 0 ; nextDate = [nextDate addTimeInterval:24*60*60] ) {
        // use date
      }
      

      如果您关心一天中的时间,您可以在开始循环之前将第一个日期舍入到中午或午夜。

      【讨论】:

      • 我使用了“timeIntervalSinceDate:”而不是“compare:”,因为 timeIntervalSinceDate 返回一个数值,尽管比较也有效。此外,“timeIntervalSinceDate”已被弃用,所以我使用了“dateByAddingTimeInterval:”我想过做这样的事情,但不知道我可以格式化这样的循环。谢谢!
      • addTimeInterval: 自 iOS 4 起已弃用。
      • 这不适合由于夏令时而具有不同小时数的日子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      相关资源
      最近更新 更多