两个日期之间的日期数组

5

我有两个日期,起始日期和结束日期,需要将它们以数组的形式列出来并存入数据库(core data)中。起始日期和结束日期以字符串形式存在数据库中。

日期格式为MM/dd/yyyy。


请找出两个日期之间的确切差异。 - pheelicks
1
@pheelicks 请仔细阅读问题,您发送了一个关于两个日期之间差异的问题链接。我也已经在这个问题上有答案。 - Ishu
@pheelicks 我认为这个问题不同于你指出的重复问题。 - xyzzycoder
6个回答

11
// 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 看起来有点啰嗦,但这是执行日历计算的正确方法。 - Costique

4

我有一个更通用的方法来使用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个日期作为输入参数,并将它们规范化为从它们的那一天开始。之后,我会按照以日历单位为定义的步骤迭代,直到达到第二个日期。 - Kex
在 Swift 3 中:calendar.date(byAdding: calendarUnit, value: 1, to: currentDate)! - Timur Bernikovich

1
你可以通过将开始日期转换为儒略日(会产生一个浮点值),迭代到结束日期,并将迭代的值从儒略日转换回NSDate对象,来很容易地实现这一目标。
我在下面回答这个问题时发布了一些方法(下面链接)来提供必要的转换。 如何使用Objective C在SQLite中获取日期时间列

这个方案不错,但是我正在使用核心数据。 - Ishu

1
这是Costique在Swift中的解决方案,但有一点Swift闪光。
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"]

0
Swift4版本的@Nick Wargnier的代码:
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
}

0

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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接