2011-07-10 109 views
15

我想改变NSDate的hh,mm,ss组件到另一个NSDate的 - 但由于某种原因,由于某种原因,时间被设置为午夜。我无法弄清楚为什么!来自NSDateComponents的NSDate

这是代码;

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

这里是控制台上的调试输出。注意小时,分钟,秒分量的值和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> 

在此先感谢。

回答

30

你产生之日起关闭toDateComponents这里,

NSDate *newDate = [cal dateFromComponents:toDateComponents]; 

toDateComponents的信息只有日期,月份和年份。它没有时间细节。所以你得到12:00:00 AM。您已将时间信息存储在toTimeComponents中,但未使用。如果你想这个工作,你将不得不添加时间信息到toDateComponents,并可能完全删除toTimeComponents变量。

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

谢谢 - 就是这样! – Sam

相关问题