2011-04-10 22 views

Respuesta

186

Al igual que con todas las manipulaciones fecha en que se tiene que utilizar NSDateComponents y NSCalendar

NSDate *now = [NSDate date]; 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSCalendarIdentifierGregorian]; 
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:now]; 
[components setHour:10]; 
NSDate *today10am = [calendar dateFromComponents:components]; 

en iOS8 Apple introdujo un método de conveniencia que guarda unas pocas líneas de código:

NSDate *d = [calendar dateBySettingHour:10 minute:0 second:0 ofDate:[NSDate date] options:0]; 

Swift:

let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) 
let now: NSDate! = NSDate() 

let date10h = calendar.dateBySettingHour(10, minute: 0, second: 0, ofDate: now, options: NSCalendarOptions.MatchFirst)! 
+10

Votado. Pero, por favor, deshazte de la liberación automática de tu código. Es 2014. –

+60

Y la respuesta fue escrita en 2011. No dudes en consultar y editar mis otras 1093 respuestas. Muchos de ellos pueden necesitar un poco de modernización. ;-) –

+2

Mi Dios, yo estaba seguro de que era nueva respuesta) –

3
NSDate *currentDate = [NSDate date]; 
NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setHour:10]; 
NSDate *date = [gregorian dateByAddingComponents:comps toDate:currentDate options:0]; 
[comps release]; 

no han sido evaluados en Xcode aunque :)

+4

Eso no funcionará. Está agregando 10 horas a la fecha y hora actuales, sin establecer el horario a las 10:00. –

+0

Lo sentimos, no he entendido bien la pregunta, la respuesta de @flucchtpunkt parece correcta –

+1

No se preocupe, dateByAddingComponents aprendido. Gracias. –

4

este nsdate utiliza formato diferente:

NSDateFormatter *format = [[NSDateFormatter alloc] init]; 
[format setDateFormat:@"MMM dd, yyyy HH:mm"]; 

NSDate *now = [[NSDate alloc] init]; 

NSString *dateString = [format stringFromDate:now]; 

NSDateFormatter *inFormat = [[NSDateFormatter alloc] init]; 
[inFormat setDateFormat:@"MMM dd, yyyy"]; 

NSDate *parsed = [inFormat dateFromString:dateString]; 
+0

En realidad, no respondió la pregunta, pero de todos modos la encontré muy útil: gracias. :) –

0

Puede utilizar este método para cualquier minuto/hora/período (también conocido como am/pm) combinación:

- (NSDate *)todayModifiedWithHours:(NSString *)hours 
          minutes:(NSString *)minutes 
         andPeriod:(NSString *)period 
{ 
    NSDate *todayModified = NSDate.date; 

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSMinuteCalendarUnit fromDate:todayModified]; 

    [components setMinute:minutes.intValue]; 

    int hour = 0; 

    if ([period.uppercaseString isEqualToString:@"AM"]) { 

     if (hours.intValue == 12) { 
      hour = 0; 
     } 
     else { 
      hour = hours.intValue; 
     } 
    } 
    else if ([period.uppercaseString isEqualToString:@"PM"]) { 

     if (hours.intValue != 12) { 
      hour = hours.intValue + 12; 
     } 
     else { 
      hour = 12; 
     } 
    } 
    [components setHour:hour]; 

    todayModified = [calendar dateFromComponents:components]; 

    return todayModified; 
} 

solicitada Ejemplo :

NSDate *todayAt10AM = [self todayModifiedWithHours:@"10" 
              minutes:@"00" 
             andPeriod:@"am"]; 
1

Acabo de configurar la zona horaria con la respuesta de Matthias Bauch Y funcionó para mí. de lo contrario, agregaba 18:30 min más.

let cal: NSCalendar = NSCalendar.currentCalendar() 
cal.timeZone = NSTimeZone(forSecondsFromGMT: 0) 
let newDate: NSDate = cal.dateBySettingHour(1, minute: 0, second: 0, ofDate: NSDate(), options: NSCalendarOptions())! 
Cuestiones relacionadas