2011-03-18 18 views
23

¿cómo configuro un tiempo existente de NSDate?¿cómo configuro una hora de NSDate existente?

Es decir, tengo una fecha (por ejemplo, fecha/hora actual), pero luego quiero configurarla para un horario específico (por ejemplo, 11.23am). ¿Cuál es la forma más rápida de hacer esto en el objetivo C?

estoy mirando NSCalendar y ver métodos como dateByAddingComponents:toDate:options:, y dateFromComponents:, pero estos no parecen bastante a golpear la marca para lo que necesito aquí. Por ejemplo:

  1. dateFromComponents: - Tendría que hacer ejercicio todos los componentes para que esto funcione, que parece un exceso
  2. dateByAddingComponents:toDate:options: - Yo no quiero añadir que en mi caso, sino más bien "ajuste" del tiempo.

Respuesta

66
NSDate *date = [NSDate date]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; 
NSDateComponents *components = [gregorian components: NSUIntegerMax fromDate: date]; 
[components setHour: 7]; 
[components setMinute: 59]; 
[components setSecond: 17]; 

NSDate *newDate = [gregorian dateFromComponents: components]; 

utilizo NSUIntegerMax en lugar de máscaras específicas O-bits combinado porque es más fácil, pero si desea especificar qué componentes de datos para recibir, adelante.

3

Aplicar esto para establecer el tiempo de una otra fecha a una fecha existente

NSDate *today = [NSDate date]; // from which i need only "Year" "Month" "Date" 

NSCalendar *calendar = [NSCalendar currentCalendar] 
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:today]; 

NSDate *timeDate = datePicker.date; // from which i need only "Hours" "Minutes" and "Seconds" 

NSDateComponents *timeComponents = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:timeDate]; 

      [dateComponents setHour:[timeComponents hour]]; 
      [dateComponents setMinute:[timeComponents minute]]; 
      [dateComponents setSecond:[timeComponents second]]; 

NSDate *newDate = [calendar dateFromComponents:dateComponents]; // New Date with My "Year" "Month" "Date" "Hours" "Minutes" and "Seconds" 

      NSLog(@"New Date: %@",newDate); 
11

iOS 7 Nota: Estoy poniendo esto en algunas de estas preguntas porque el uso de NSUIntegerMax ya no parece funcionar en iOS7, y usarlo me hizo perseguir mi cola durante aproximadamente 3 horas. Acabo de descubrir que cuando uso NSUIntegerMax, NSDateComponents ignora el año establecido. Así, por ejemplo, esto no cambia el año:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *comps = [gregorian components:NSUIntegerMax fromDate:date]; 
[comps setYear:year]; 
return [gregorian dateFromComponents:comps]; 

que esto se entiende:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSUInteger timeComps = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit); 
NSDateComponents *comps = [gregorian components:timeComps fromDate:date]; 
[comps setYear:year]; 
return [gregorian dateFromComponents:comps]; 

Puede ser un error iOS7 o puede ser que el uso de NSUIntegerMax de trabajo fue un golpe de suerte que ya no funciona. Archivaré un informe de error y obtendré una respuesta definitiva.

Independientemente, si desea evitar consecuencias inesperadas, especifique TODOS los componentes, ¡de lo contrario podría estar persiguiendo la cola!

1

Un rápido ejemplo. Para mis propósitos, quería obtener la fecha para alrededor de las 12 del mediodía de mañana.

var tomorrow:NSDate = NSDate().dateByAddingTimeInterval(60*60*24); //60seconds*60minutes*12hours 
var gregorian:NSCalendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!; 
var unit : NSCalendarUnit = (NSCalendarUnit.YearCalendarUnit|NSCalendarUnit.MonthCalendarUnit|NSCalendarUnit.DayCalendarUnit|NSCalendarUnit.HourCalendarUnit|NSCalendarUnit.MinuteCalendarUnit); 
var comps:NSDateComponents = gregorian.components(unit, fromDate: tomorrow); 
comps.setValue(12, forComponent: NSCalendarUnit.HourCalendarUnit); 
comps.setValue(0, forComponent: NSCalendarUnit.MinuteCalendarUnit); 
var noon_tomorrow : NSDate = gregorian.dateFromComponents(comps)!; 
+0

Any Help with that? http://stackoverflow.com/questions/31263690/how-to-set-current-time-in-swift –

7

Swift versión 2.0 de cómo lo haces con una fecha determinada a 08 a.m.

extension NSDate { 

func setTo8AM() -> NSDate { 
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
    let components = calendar.components(([.Day, .Month, .Year]), fromDate: self) 
    components.hour = 8 
    return calendar.dateFromComponents(components)! 
} 

} 
3

Aquí está una extensión más genérico Swift (v2.1.1) que se basa en respuesta útil de Andrew Schreiber.

extension NSDate { 
    func dateWithTime(hour: Int, minute: Int, second: Int) -> NSDate? { 
     let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)! 
     let components = calendar.components(([.Day, .Month, .Year]), fromDate: self) 
     components.hour = hour 
     components.minute = minute 
     components.second = second 
     let newDate = calendar.dateFromComponents(components) 
     return newDate 
    } 
} 
Cuestiones relacionadas