【问题标题】:Array for dates between two dates两个日期之间的日期数组
【发布时间】:2011-02-04 08:33:28
【问题描述】:

我在数据库(核心数据)中的条目有两个日期星日期和最后日期。现在我需要以数组形式创建日期列表。 开始日期和结束日期在数据库中具有字符串形式。

日期格式为 MM/dd/yyyy。

【问题讨论】:

  • @pheelicks 仔细阅读了这个问题,您发送了一个问题链接,其中需要两个日期之间的差异。我也有这个问题的答案。
  • @pheelicks 我认为这个问题与您指出的重复问题不同。

标签: iphone core-data date


【解决方案1】:
// minDate and maxDate represent your date range
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *days = [[NSDateComponents alloc] init];
NSInteger dayCount = 0;
while ( TRUE ) {
    [days setDay: ++dayCount];
    NSDate *date = [gregorianCalendar dateByAddingComponents: days toDate: minDate options: 0];
    if ( [date compare: maxDate] == NSOrderedDescending )
        break;
    // Do something with date like add it to an array, etc.
}
[days release];
[gregorianCalendar release];

【讨论】:

  • 不客气。 NSCalendar API 看起来有点冗长,但它是执行日历计算的正确方法。
【解决方案2】:

我有一个更通用的方法,NSCalendarUnit 用于定义日期之间的步骤并处理标准化日期。

iOS 8 API,Swift 2.0

    func generateDates(calendarUnit: NSCalendarUnit, startDate: NSDate, endDate: NSDate) -> [NSDate] {

            let calendar = NSCalendar.currentCalendar()
            let normalizedStartDate = calendar.startOfDayForDate(startDate)
            let normalizedEndDate = calendar.startOfDayForDate(endDate)

            var dates = [normalizedStartDate]
            var currentDate = normalizedStartDate

            repeat {

                currentDate = calendar.dateByAddingUnit(calendarUnit, value: 1, toDate: currentDate, options: NSCalendarOptions.MatchNextTime)!
                dates.append(currentDate)

            } while !calendar.isDate(currentDate, inSameDayAsDate: normalizedEndDate)

            return dates
    }

【讨论】:

  • @G.Abhisek 我将 2 个日期作为输入参数并将它们标准化为从一天的开始。之后,我按定义为日历单位的步骤进行迭代,这是输入参数,直到我到达第二个日期。
  • 在 Swift 3 中:calendar.date(byAdding: calendarUnit, value: 1, to: currentDate)!
【解决方案3】:

您可以通过将开始日期转换为儒略日(这将产生一个浮点值)、迭代到结束日期并将迭代的儒略日值转换回 NSDate 对象来轻松完成此操作。

我在对这个问题(如下)的回答中发布了一些方法,这些方法将提供必要的转换。

How get a datetime column in SQLite with Objective C

【讨论】:

  • 它更好,但我正在使用核心数据。
【解决方案4】:

这是 Costique 的 swift 解决方案,但带有一点 swift flash。

func ...(lhs:NSDate, rhs:NSDate) -> [NSDate] {
  var dates: [NSDate] = []
  var cal = NSCalendar.currentCalendar() // or NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
  var days = NSDateComponents()
  var dayCount = 0
  while true {
    days.day = dayCount
    let date:NSDate = cal.dateByAddingComponents(days, toDate: lhs, options: NSCalendarOptions.allZeros)!
    if date.compare(rhs) == .OrderedDescending {
      break
    }
    dayCount += 1
    dates.append(date)
  }

  return dates
}

let fromDate = NSDate(timeIntervalSince1970: 1440711319)
let toDate = NSDate(timeIntervalSince1970: 1441316129)

fromDate...toDate // => ["Aug 27, 2015, 2:19 PM", "Aug 28, 2015, 2:19 PM", "Aug 29, 2015, 2:19 PM", "Aug 30, 2015, 2:19 PM", "Aug 31, 2015, 2:19 PM", "Sep 1, 2015, 2:19 PM", "Sep 2, 2015, 2:19 PM", "Sep 3, 2015, 2:19 PM"]

【讨论】:

    【解决方案5】:

    Swift 3.0:

    假设您想要获取从今天到接下来 60 天的日期数组。

    extension Date {
        func generateDates(startDate :Date?, addbyUnit:Calendar.Component, value : Int) -> [Date]
    {
        let calendar = Calendar.current
        var datesArray: [Date] =  [Date] ()
    
        for i in 0 ... value {
            if let newDate = calendar.date(byAdding: addbyUnit, value: i + 1, to: startDate!) {
                datesArray.append(newDate)
            }
        }
    
        return datesArray
    }
    }
    

    用法:

    var datesArrayByAddingDays:[Date]?
    
    override func viewWillAppear(_ animated: Bool) {
    
        datesArrayByAddingDays = Date().generateDates(startDate: Date(), addbyUnit: .day, value: 60)
    }
    

    【讨论】:

      【解决方案6】:

      @Nick Wargnier 的 Swift4 版本:

      func ...(lhs:Date, rhs:Date) -> [Date] {
          var dates = [Date]()
          let cal = NSCalendar.current
          var days = DateComponents()
          var dayCount = 0
          while true {
              days.day = dayCount
              let date = cal.date(byAdding: days, to: lhs)!
              if date.compare(rhs) == .orderedDescending {
                  break
              }
              dayCount += 1
              dates.append(date)
          }
      
          return dates
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        • 2020-03-02
        • 2015-08-15
        • 1970-01-01
        相关资源
        最近更新 更多