2011-12-05 10 views
10

¿Hay alguna manera de encontrar una diferencia exacta entre dos NSDate?Obtenga una diferencia de tiempo exacta entre dos NSDate?

He encontrado soluciones pero no son lo suficientemente precisas. Necesito tener en cuenta el horario de verano, el hecho de que diferentes meses tienen un número diferente de días, etc.

Un cálculo simple como/60/60/24, etc. para calcular minutos, horas y días doesn ' t tomarlos en cuenta.

Digamos que tengo que trabajar la diferencia entre el tiempo en este momento ([NSDate date]) y 25 de diciembre 22:22 (fecha elegida por el usuario mediante un selector de fechas [datePicker date]) sólo como un ejemplo, ¿cómo hacer esto?
Conocer la diferencia de tiempo exacta no es la clave, siempre que tenga una diferencia exacta de días, meses y años, lo hará.

+0

http://stackoverflow.com/ preguntas/1237778/how-do-i-break-down-a-nstimeinterval-en-year-months-days-hours-minutes-una posible duplicación –

+1

El cálculo calendárico es difícil. Las personas inteligentes regularmente lo hacen mal. La trampa más grande es creer que es simple. Tómatelo con calma y espera cometer errores en el camino. Lo que hay que tener en cuenta es que Cocoa ofrece excelentes herramientas para hacerlo bien, pero aparentemente no es fácil hacerlo lo que quiero decir con las herramientas. El primer paso es leer y volver a leer los documentos y segundo adivinar su comprensión. Se requiere una comprensión clara de ellos para definir completamente su problema y solución reales. Puede ser frustrante, pero en realidad proporcionan herramientas que lo obligan a hacerlo bien (después de un poco de esfuerzo) – uchuugaka

Respuesta

25

de Apple de Date & Time Programming Guide:

Listado 12 Conseguir la diferencia entre dos fechas

NSDate *startDate = ...; 
NSDate *endDate = ...; 

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

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit; 

NSDateComponents *components = [gregorian components:unitFlags 
              fromDate:startDate 
              toDate:endDate options:0]; 
NSInteger months = [components month]; 
NSInteger days = [components day]; 
15

NSDate es completamente independiente de la zona horaria. La hora de verano no aparece en NSDate. Solo cuando convierte NSDate en un formato legible para personas (formato MM/DD/AA, HH: MM: SS o similar), la Zona Huso aparece en la imagen.

Asegúrese de que se tome en cuenta la zona horaria correcta, ajuste de ahorro de luz del día cuando crear NSDate (s). Posteriormente, el método, [date1 timeIntervalSinceDate:date2] siempre debe darle una diferencia de tiempo precisa.

+1

El problema es que con ese método es que obtengo un número exacto de segundos entre las dos fechas, pero luego lo sumerjo en días , los meses y los años son inexactos, ya que sería demasiado complejo tener en cuenta cómo son los días en ese mes o año, cambie el divisor. ¿Entender? Por eso he evitado esto. –

+0

La respuesta de Sanjay Chaudhry responde a su pregunta. Supongo que no hizo una pregunta lo suficientemente precisa. – ader

0

pequeña actualización sobre el código de última IOS:

NSDate *startDate = ...; 
NSDate *endDate = ...; 

NSCalendar *gregorian = [[NSCalendar alloc] 
          initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay; 

NSDateComponents *components = [gregorian components:unitFlags 
              fromDate: startDate 
               toDate:endDate options:0]; 
NSInteger months = [components month]; 
NSInteger days = [components day]; 
Cuestiones relacionadas