2011-02-04 33 views
5

Tengo dos fechas de fecha y última fecha para una entrada en la base de datos (datos básicos). Ahora necesito crear una lista de fechas en forma de matriz. Fecha de inicio y fecha de finalización con formato de cadena en la base de datos.Matriz de fechas entre dos fechas

El formato de fecha es MM/dd/aaaa.

+0

duplicado: http://stackoverflow.com/questions/4544406/find-exact-difference -entre dos fechas – pheelicks

+1

@pheelicks lea detenidamente la pregunta, envíe un enlace de pregunta en el que se desea la diferencia entre dos fechas.y estoy teniendo respuesta sobre esta questi encendido también – Ishu

+0

@pheelicks No creo que esta pregunta sea igual a la que está señalando como un duplicado. – xyzzycoder

Respuesta

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]; 
+0

Excelente hermano, funciona demasiado, muy bien. – Ishu

+0

De nada. NSCalendar API parece un poco detallado, pero es * la * forma correcta de realizar cálculos calendric. – Costique

+0

Humm thanx Costique. – Ishu

1

Esto se puede lograr fácilmente convirtiendo la fecha de inicio a un día juliano (que producirá un valor flotante), iterando hasta la fecha final y convirtiendo los valores iterados de días julianos en objetos NSDate.

He publicado algunos métodos en mi respuesta a esta pregunta (a continuación) que proporcionarán las conversiones necesarias.

How get a datetime column in SQLite with Objective C

+0

Es mejor, pero estoy usando datos básicos. – Ishu

1

Aquí está la solución de Costique en rápida pero con un pequeño flash rápida.

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"] 
4

que tienen un enfoque más general con NSCalendarUnit para definir el paso entre las fechas & que se ocupan de las fechas siendo normalizado.

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 
    } 
+0

¿Puede explicar un poco sus códigos? –

+0

@ G.Abhisek Tomo las 2 fechas como parámetros de entrada y las normalizo para comenzar al comienzo de su día. Después, itero por un paso definido como la unidad de calendario que es el parámetro de entrada hasta que llego a la 2da fecha. – Kex

+0

En Swift 3: 'calendar.date (por Agregar: calendarUnit, value: 1, to: currentDate)!' –

0

Swift 3.0:

Supongamos que desea obtener el conjunto de las fechas a partir de hoy hasta próximos 60 días.

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

Uso:

var datesArrayByAddingDays:[Date]? 

override func viewWillAppear(_ animated: Bool) { 

    datesArrayByAddingDays = Date().generateDates(startDate: Date(), addbyUnit: .day, value: 60) 
} 
0

versión de Swift4 @ Nick Wargnier de:

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 
}