2011-12-05 11 views
10

C'è un modo per scoprire una differenza accurata tra due NSDate?Ottieni un'accurata differenza di orario tra due NSDate?

Ho trovato soluzioni ma non sono sufficientemente accurate. Devo tener conto dell'ora legale, il fatto che diversi mesi hanno un numero diverso di giorni, ecc.

Un semplice calcolo come/60/60/24 ecc. Per calcolare minuti, ore e giorni non fa t tenerne conto

Diciamo che ho bisogno di lavorare fuori la differenza tra il tempo in questo momento ([NSDate date]) e 25 Dicembre 22:22 (data scelta dall'utente con data picker [datePicker date]) tanto per fare un esempio, come faccio a fare questo?
Conoscere l'esatta differenza di fuso orario non è la chiave, fintanto che ho una differenza precisa di giorni, mesi e anni, lo farò.

+0

http://stackoverflow.com/ domande/1237778/how-do-i-break-down-an-nstimeinterval-in-year-months-days-hours-minutes-un possibile doppaglio –

+1

Il calcolo del calendario è difficile. Le persone intelligenti sbagliano regolarmente. La più grande trappola è credere che sia semplice. Prendilo lentamente e aspettati di sbagliare lungo la strada. La cosa da notare è che Cocoa fornisce ottimi strumenti per farlo bene, ma apparentemente non è facile fare ciò che intendo per strumenti. La prima fase viene letta e riletta i documenti e poi indovina la tua comprensione. Ci vuole una chiara comprensione di loro per definire pienamente il problema e la soluzione. Può essere frustrante, ma in realtà forniscono strumenti che ti costringono a farlo correttamente (dopo un po 'di difficoltà) – uchuugaka

risposta

25

Da Apple Date & Time Programming Guide:

Listing 12 Ottenere la differenza tra due date

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 è completamente indipendente dal fuso orario. L'illuminazione diurna non viene nemmeno visualizzata per NSDate. Solo quando si converte NSDate in un formato leggibile dall'uomo (MM/GG/AA, HH: MM: formato SS o simile), il fuso orario entra in scena.

Assicurarsi che si prende in considerazione corretto fuso orario, impostazione di risparmio luce del giorno quando si creare NSDate (s). Successivamente, il metodo [date1 timeIntervalSinceDate:date2] dovrebbe sempre fornire una differenza di tempo precisa.

+1

Il problema è che ho un numero esatto di secondi di os tra le due date ma poi l'ho fatto in giorni , mesi e anni sono imprecisi in quanto sarebbe troppo complesso per tenere conto di come i giorni virili sono in quel mese o anno, cambiare il divisore. Capire? Questo è il motivo per cui ho evitato questo. –

+0

La risposta di Sanjay Chaudhry risponde alla tua domanda. Immagino che tu non abbia fatto una domanda abbastanza precisa. – ader

0

Piccolo aggiornamento sul codice per ultimo 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];