2011-03-14 24 views

Respuesta

15
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
NSDateComponents *comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:day1]; 
NSDate *day3 = [[NSCalendar currentCalendar] dateFromComponents:comps]; 

unitFlags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 
comps = [[NSCalendar currentCalendar] components:unitFlags fromDate:day2]; 
day3 = [[NSCalendar currentCalendar] dateByAddingComponents:comps toDate:day3 options:0]; 

Fuentes:

  1. NSDateComponents Class Reference
  2. NSCalendar Class Reference
+1

Para evitar problemas con el verano I recomendamos configurar el calendario actual en la zona horaria UTC. –

0

Necesita crear un NSCalendar y luego obtener los componentes de fecha de la primera y segunda fecha y luego obtener la fecha utilizando los nuevos componentes de fecha de NSCalendar.

métodos

Usa el NSCalendar

– components:fromDate: 
– dateFromComponents: 

y las banderas de unidades correspondientes

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit; 
1

No es tan compacto como darvids0n, pero funciona.

NSDate* day1 = [datePicker dateValue]; 
NSDate* day2 = [NSDate date]; 

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:day1; 
NSInteger day = [components day];  
NSInteger month = [components month]; 
NSInteger year = [components year]; 

components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit fromDate:day2]; 
NSInteger hour = [components hour];  
NSInteger minute = [components minute]; 
NSInteger second = [components second]; 

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease]; 
[comps setDay:day]; 
[comps setMonth:month]; 
[comps setYear:year]; 
[comps setHour:hour]; 
[comps setMinute:minute]; 
[comps setSecond:second]; 
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDate *day3 = [cal dateFromComponents:comps]; 

o

NSDateFormatter *tempFormatter = [[[NSDateFormatter alloc]init]autorelease]; 
[tempFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
NSString* message = [NSString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d", year, month, day, hour, minute, second]; 
NSDate *day3 = [tempFormatter dateFromString:message]; 
0

Para los registros, aquí es un enfoque más general

@implementation NSDate (Additions) 

- (void)assignFlags:(NSUInteger)unitFlags to:(NSDateComponents *)components { 
    NSDateComponents *myComponents = 
     [[NSCalendar currentCalendar] components: unitFlags 
             fromDate: self]; 
    if (unitFlags & NSYearCalendarUnit) 
    [components setYear: [myComponents year]]; 
    if (unitFlags & NSMonthCalendarUnit) 
    [components setMonth: [myComponents month]]; 
    if (unitFlags & NSDayCalendarUnit) 
    [components setDay: [myComponents day]]; 
    if (unitFlags & NSHourCalendarUnit) 
    [components setHour: [myComponents hour]]; 
    if (unitFlags & NSMinuteCalendarUnit) 
    [components setMinute: [myComponents minute]]; 
    if (unitFlags & NSSecondCalendarUnit) 
    [components setSecond: [myComponents second]]; 
} 

- (NSDate *)dateByTakingComponents:(NSUInteger)unitFlags fromDate:(NSDate *)date { 

    NSUInteger allFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | 
    NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

    NSDateComponents *allComponents = [[NSDateComponents alloc] init]; 
    [date assignFlags: unitFlags to: allComponents]; 
    [self assignFlags: allFlags & ~unitFlags to: allComponents]; 

    NSDate *result = [[NSCalendar currentCalendar] dateFromComponents: allComponents]; 
    [allComponents release]; 

    return result; 
} 

@end 

Se le puede llamar como esto

NSDate *day3 = 
    [day2 dateByTakingComponents: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit 
         fromDate: day1];