2009-07-21 10 views
25

Me gustaría restar 4 horas de una fecha. Leí la cadena de fecha en un objeto NSDate use el siguiente código:¿Cómo se pueden restar horas de un NSDate?

NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
NSDate * mydate = [dateFormatter dateFromString:[dict objectForKey:@"published"]]; 

¿Qué hago después?

+4

(Es ahora 6 años y 4 versiones principales de XCode tarde ... ¡¡y la funcionalidad de NSDate sigue siendo tan poco intuitiva como en 2009 !!) –

Respuesta

23

NSCalendar es la API general para cambiar las fechas en función de las unidades de tiempo humanas. Para esto, puede usar NSCalendar's -dateByAddingComponents:toDate:options: con un número negativo de horas.

+0

Este es un enfoque mucho mejor: se trata de DST, años bisiestos, todo eso. – drewh

+0

NSCalendar no es una API recomendada para usar. http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendarDate_Class/Reference/Reference.html – oberbaum

+10

@norskben: esa página es para NSCalendar ** Fecha **. Eso es lo que dice no usar. Recomienda específicamente NSCalendar como reemplazo en la misma nota. – Chuck

45
NSDate *newDate = [theDate dateByAddingTimeInterval:-3600*4]; 

Link to documentation.


NSDate *newDate = [[[NSDate alloc] initWithTimeInterval:-3600*4 
               sinceDate:theDate]] autorelease]; 

Link to documentation.

+0

pregunta anterior Sé, pero addTimeInterval parece estar en desuso ahora, ¿hay alguna razón para esto? –

+3

@ DreamLane: Porque esto no usaba la misma convención de nomenclatura que el resto de la API. 'addTimeInterval:' sugiere que 'NSDate' es mutable, que no lo es. –

+1

Gracias por la respuesta rápida, ¡también gracias por editar su respuesta con el nombre del método actualizado! +1 –

1

Hey Miriam,
La función dateFromString devuelve NSDate, no NSString. debe cambiar,

NSDate * theDate = [dateFormatter dateFromString: datetemp];

Espero que ayude,
mejores.
G.

6

Desde iOS 8 no es el más conveniente dateByAddingUnit:

2.x Swift

//subtract 3 hours 
let calendar = NSCalendar.autoupdatingCurrentCalendar() 
newDate = calendar.dateByAddingUnit(.Hour, value: -3, toDate: originalDate, options: []) 
+1

Comentario dice resta, sin embargo 3 se usó como valor, debería ser -3 – naz

+0

Gracias, actualizado. –

4
//in Swift 3 
//subtract 3 hours 
let calendar = NSCalendar.autoupdatingCurrent 
newDate = calendar.date(byAdding:.hour, value: -3, to: originalDate) 
Cuestiones relacionadas