2011-07-10 8 views
15

Próbuję zmienić składnik hh, mm, ss z NSDate na inny NSDate - ale z jakiegoś powodu, z jakiegoś powodu czas jest ustawiony na północ. Nie rozumiem dlaczego!NSDate z NSDateComponents

Oto kod;

+ (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]; 
} 

i tutaj jest wyjście debugowania na konsoli. Zanotuj wartości godzin, minut, sekund komponentów i końcową wartość 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> 

Z góry dziękuję.

Odpowiedz

30

są generowania datę wyłączenia toDateComponents Tutaj

NSDate *newDate = [cal dateFromComponents:toDateComponents]; 

Informacje zawarte w toDateComponents jest tylko data, miesiąc i rok. Nie ma szczegółów dotyczących czasu. Otrzymasz 12:00:00 AM. Informacje o czasie zostały zapisane w numerze toTimeComponents, ale nie jest on używany. Jeśli chcesz, aby to działało, będziesz musiał dodać informację o czasie do toDateComponents i prawdopodobnie całkowicie usunąć zmienną toTimeComponents.

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

Dziękuję - to było to !! – Sam