iphone objective-c nsdate nsdatecomponents

iphone - NSDate de NSDateComponents



objective-c (1)

Estoy tratando de cambiar el componente hh, mm, ss de un NSDate al de otro NSDate, pero por alguna razón, el tiempo se establece en la medianoche por algún motivo. ¡No puedo entender por qué!

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 los componentes de hora, min, seg 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 por adelantado.


Usted está generando la fecha de vencimiento a toDateComponents aquí

NSDate *newDate = [cal dateFromComponents:toDateComponents];

La información en toDateComponents es solo la fecha, el mes y el año. No tiene los detalles del tiempo. Así que tienes 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 a toDateComponents y probablemente eliminar la variable toTimeComponents completo.

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