2011-01-28 22 views
6

Necesito crear un NSDate de la fecha actual (o en cualquier NSDate) sin las horas, minutos y segundos y mantenerlo como un NSDate, en la menor cantidad de líneas posible?¿Cómo creo la fecha actual (o cualquier fecha) como un NSDate sin horas, minutos y segundos?

Necesito realizar algunos cálculos sobre las fechas y tener horas, minutos y segundos que causan problemas, necesito fechas absolutas (espero que absoluta sea la frase correcta). Es para una aplicación de iPhone.

Estoy creando fechas con [NSDate date] que agregan horas, minutos y segundos. También estoy agregando meses a fechas que creo que son útiles para el ahorro de luz diurna ya que recibo 2300 horas en algunas fechas.

Por lo tanto, idealmente necesito una función para crear NSDates absolutos desde NSDates.

Sé que hice una pregunta similar anteriormente, pero tengo que terminar con NSDate no como una cadena y me preocupa un poco especificar un formato de fecha, p. yyyy etc.

Respuesta

32

En primer lugar, debe comprender que incluso si tira horas, minutos y segundos de un NSDate, aún representará un solo momento en el tiempo. Nunca obtendrá un NSDate para representar un día completo como 2011-01-28; siempre será 2011-01-28 00:00:00 +00:00. Eso implica que también debe tener en cuenta las zonas horarias.

Aquí es un método (a ser implementado como una categoría NSDate) que devuelve un NSDate a la medianoche UTC en el mismo día que self:

- (NSDate *)midnightUTC { 
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    [calendar setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; 

    NSDateComponents *dateComponents = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit 
                fromDate:self]; 
    [dateComponents setHour:0]; 
    [dateComponents setMinute:0]; 
    [dateComponents setSecond:0]; 

    NSDate *midnightUTC = [calendar dateFromComponents:dateComponents]; 
    [calendar release]; 

    return midnightUTC; 
} 
+1

Siempre Ole, pegándome a la respuesta! ; ( Buena respuesta, como siempre. –

+0

+1 un buen trabajo completo –

+4

No necesita agregar '[dateComponents setHour: 0]; [dateComponents setMinute: 0]; [dateComponents setSecond: 0];' desde usted no tiene estos componentes en la var de dateComponents, el NSDate se creará en '00:00:00 + 0000'. –

2
NSDate *oldDate = [NSDate date]; 
NSCalendarUnit requiredDateComponents = NSYearCalendarUnit| NSMonthCalendarUnit | NSDayCalendarUnit;  
NSDateComponents *components = [[NSCalendar currentCalendar] components:requiredDateComponents fromDate:oldDate]; 
NSDate *newDate = [[NSCalendar currentCalendar] dateFromComponents:components]; 
Cuestiones relacionadas