2012-10-01 14 views
19

¿Cómo puedo verificar si una fecha es inherentemente MAÑANA?Objetivo C: obtenga el día siguiente a partir de hoy (mañana)

No quiero agregar horas o algo a una fecha como hoy, porque si hoy ya es 22:59, agregar demasiado pasaría al día siguiente y agregar muy poco si el tiempo es 12:00 se lo perderá mañana .

¿Cómo puedo verificar dos NSDate sy asegurarme que uno es el equivalente de mañana para el otro?

+1

posible duplicado de [¿Cómo puedo obtener próxima fecha usando NSDate?] (Http: // stackoverflow.com/questions/1081689/how-can-i-get-next-date-using-nsdate) – raina77ow

Respuesta

49

Utilizando NSDateComponents puede extraer componentes de día/mes/año a partir de la fecha que representa hoy, ignorando los componentes de hora/minutos/segundos, agregar un día y reconstruir una fecha correspondiente al día de mañana.

Imagine que desea agregar exactamente un día a la fecha actual (incluida la información de horas/minutos/segundos igual a la fecha "ahora"), puede agregar un intervalo de tiempo de 24 * 60 * 60 segundos a " ahora" utilizando dateWithTimeIntervalSinceNow, pero es mejor (y el horario de verano a prueba, etc) para hacerlo de esta manera el uso de NSDateComponents:

NSDateComponents* deltaComps = [[[NSDateComponents alloc] init] autorelease]; 
[deltaComps setDay:1]; 
NSDate* tomorrow = [[NSCalendar currentCalendar] dateByAddingComponents:deltaComps toDate:[NSDate date] options:0]; 

pero si desea generar la fecha correspondiente a la mañana a la medianoche, en su lugar podría solo recupere los componentes mes/día/año de la fecha que representa ahora, sin horas/minutos/segundos parte, y añadir al menos 1 día, y luego reconstruir una fecha:

// Decompose the date corresponding to "now" into Year+Month+Day components 
NSUInteger units = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 
NSDateComponents *comps = [[NSCalendar currentCalendar] components:units fromDate:[NSDate date]]; 
// Add one day 
comps.day = comps.day + 1; // no worries: even if it is the end of the month it will wrap to the next month, see doc 
// Recompose a new date, without any time information (so this will be at midnight) 
NSDate *tomorrowMidnight = [[NSCalendar currentCalendar] dateFromComponents:comps]; 

P.S .: Usted puede leer consejos muy útiles y cosas acerca de los conceptos de fecha en la Date and Time Programming Guide, especialmente here about date components.

+0

Muy, muy buena respuesta! –

+0

¿Cómo se soluciona el hecho de que 'dateFromComponents' de' NSCalendar' devuelva el resultado 'nullable'? Sé que el mañana siempre existe y quiero usar este hecho durante la codificación. Sin embargo, cuando uso este enfoque en Swift 'tomorrowMidnight' _may_ be' nil', al menos eso es lo que piensa el compilador. – i4niac

6

En iOS 8 hay un método de conveniencia en NSCalendar llamado isDateInTomorrow.

Objective-C

NSDate *date; 
BOOL isTomorrow = [[NSCalendar currentCalendar] isDateInTomorrow:date]; 

Swift 3

let date: Date 
let isTomorrow = Calendar.current.isDateInTomorrow(date) 

Swift 2

let date: NSDate 
let isTomorrow = NSCalendar.currentCalendar().isDateInTomorrow(date) 
Cuestiones relacionadas