2011-07-10 9 views
15

Estoy tratando de alterar el componente hh, mm, ss de un NSDate al de otro NSDate, pero por algún motivo, la hora se ajusta a medianoche por algún motivo. No puedo entender por qué!NSDate from NSDateComponents

Aquí está el código;

+ (NSDate *) fixTime:(NSDate*)fromDate toDate:(NSDate *) toDate { 
    NSCalendar *cal = [NSCalendar currentCalendar]; 
    [cal setTimeZone:[NSTimeZone localTimeZone]]; 
    [cal setLocale:[NSLocale currentLocale]]; 
    NSLog(@"fromDate=<%@>", [fromDate descriptionWithLocale:[NSLocale currentLocale]]); 
    NSLog(@"toDate= <%@>", [toDate descriptionWithLocale:[NSLocale currentLocale]]); 

    NSDateComponents *fromTimeComponents = [cal components:(NSHourCalendarUnit | 
                  NSMinuteCalendarUnit | 
                  NSSecondCalendarUnit ) fromDate:fromDate];        
    NSDateComponents *toDateComponents = [cal components:(NSYearCalendarUnit | 
                  NSMonthCalendarUnit | 
                  NSDayCalendarUnit  ) fromDate:toDate]; 
    NSDateComponents *toTimeComponents = [cal components:(NSHourCalendarUnit | 
                  NSMinuteCalendarUnit | 
                  NSSecondCalendarUnit ) fromDate:toDate]; 
    [toTimeComponents setHour:[fromTimeComponents hour]]; 
    [toTimeComponents setMinute:[fromTimeComponents minute]]; 
    [toTimeComponents setSecond:[fromTimeComponents second]]; 
    NSLog(@"toDateComponents year = %d", [toDateComponents year]);              
    NSLog(@"toDateComponents mon = %d", [toDateComponents month]);              
    NSLog(@"toDateComponents day = %d", [toDateComponents day]); 
    NSLog(@"toTimeComponents hour = %d", [toTimeComponents hour]);              
    NSLog(@"toTimeComponents min = %d", [toTimeComponents minute]);              
    NSLog(@"toTimeComponents sec = %d", [toTimeComponents second]); 

    NSDate *newDate = [cal dateFromComponents:toDateComponents]; 
    NSLogDebug(@"newDate=<%@>", [newDate descriptionWithLocale:[NSLocale currentLocale]]); 
    return [[newDate retain] autorelease]; 
} 

y aquí está la salida de depuración en la consola. Tenga en cuenta los valores de la hora, minutos, los componentes de SEC y el valor final de NewDate:

<Util.m:229> fromDate=<Monday, July 11, 2011 10:35:00 PM Pacific Daylight Time> 
    <Util.m:230> toDate= <Saturday, July 23, 2011 9:35:00 PM Pacific Daylight Time> 

    <Util.m:255> toDateComponents year = 2011 
    <Util.m:256> toDateComponents mon = 7 
    <Util.m:257> toDateComponents day = 23 
    <Util.m:258> toTimeComponents hour = 22 
    <Util.m:259> toTimeComponents min = 35 
    <Util.m:260> toTimeComponents sec = 0 
    <Util.m:266> newDate=<Saturday, July 23, 2011 12:00:00 AM Pacific Daylight Time> 

Gracias de antemano.

Respuesta

30

Estás generando la fecha de toDateComponents aquí,

NSDate *newDate = [cal dateFromComponents:toDateComponents]; 

La información contenida en toDateComponents es sólo la fecha, el mes y el año. No tiene los detalles de tiempo. Entonces obtienes 12:00:00 AM. Ha almacenado la información de tiempo en toTimeComponents pero no se usa. Si desea que esto funcione, tendrá que agregar la información de tiempo al toDateComponents y probablemente eliminar la variable toTimeComponents por completo.

[toDateComponents setHour:[fromTimeComponents hour]]; 
[toDateComponents setMinute:[fromTimeComponents minute]]; 
[toDateComponents setSecond:[fromTimeComponents second]]; 
+1

Gracias, eso fue todo !! – Sam