Pregunta

¿Cómo configuro un existente? NSDate¿Es hora?

Es decir, tengo una fecha (digamos la fecha/hora actual), pero luego quiero establecer esto en una hora específica (por ejemplo, 11.23am), digamos. ¿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 dar en el blanco por lo que necesito aquí. Por ejemplo:

  1. dateFromComponents: - Tendría que resolver todos los componentes para que esto funcione, lo que parece exagerado
  2. dateByAddingComponents:toDate:options: - No quiero agregar mi caso, sino "establecer" la hora.
¿Fue útil?

Solución

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];

yo suelo NSUIntegerMax En lugar de máscaras de bits específicas o combinadas porque es más fácil, pero si desea especificar qué componentes de datos recibir, ser mi invitado.

Otros consejos

Nota de iOS 7: Estoy poniendo esto en algunas de estas preguntas porque el uso de Nsuintegermax ya no parece funcionar en iOS7, y usarla me hizo perseguir mi cola durante aproximadamente 3 horas. Acabo de descubrir que cuando uso NSUIntegerMax, NSDateComponentsignora el año establecido. Entonces, 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];

Mientras que esto lo hace:

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 de iOS7 o puede ser que el uso de Nsuintegermax funcione fue una casualidad que ya no funciona. Presentaré un informe de errores y obtendré una respuesta definitiva.

De todos modos, si desea evitar consecuencias inesperadas, especifique todos los componentes de lo contrario, ¡podría estar persiguiendo su cola!

Versión Swift 2.0 de cómo estableciste una fecha determinada a las 8 am

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)!
}

}

Aplique esto para establecer el tiempo de 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);

Aquí hay una extensión Swift más genérica (V2.1.1) que se basa en la útil respuesta 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
    }
}

Un ejemplo rápido. 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)!;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top