2015-11-18 16 views
5

Im nuova programmazione rapida e non ho potuto trovare con successo il codice per trovare la differenza tra due date in termini di anni, mesi e giorni. Ho provato il seguente codice, ma non ha funzionatoCalcola la durata tra data ios in anni, mesi e formato data

let form = NSDateComponentsFormatter() 
form.maximumUnitCount = 2 
form.unitsStyle = .Full 
let s = form.stringFromTimeInterval(date2.timeIntervalSinceReferenceDate - date1.timeIntervalSinceReferenceDate) 

ingresso

Data1 = "12/Marzo/2015"

Data2 = "1/Giugno/2015"

uscita: x anni y mesi z giorni

Si prega di consulenza

+4

* "questo non è al lavoro per le mie esigenze" * è inutile come descrizione del problema. Si prega di mostrare i dati esatti di input, l'output atteso e l'output effettivo. –

+0

E stringFromTimeInterval è inutile perché getta via informazioni preziose.29 giorni a volte un mese più un giorno, a volte un mese, a volte solo 29 giorni. – gnasher729

+0

@vikingosegundo: il thread di riferimento non spiega come viene utilizzato ** NSDateComponentsFormatter **, quindi non lo considererei un duplicato. –

risposta

4

Se è necessario la differenza (in anni, mesi, giorni) numericamente poi calcolo NSDateComponents come in Swift days between two NSDates o Rajan's answer.

Se è necessario la differenza come una stringa (localizzato) per presentare all'utente, quindi utilizzare NSDateComponentsFormatter come questo

let form = NSDateComponentsFormatter() 
form.maximumUnitCount = 2 
form.unitsStyle = .Full 
form.allowedUnits = [.Year, .Month, .Day] 
let s = form.stringFromDate(date1, toDate: date2) 

Come già detto nei commenti, calcolando la differenza dalla pura intervallo di tempo tra le date non può dare risultati corretti perché la maggior parte delle informazioni sulle date è persa.

Aggiornamento per Swift 3:

let form = DateComponentsFormatter() 
form.maximumUnitCount = 2 
form.unitsStyle = .full 
form.allowedUnits = [.year, .month, .day] 
let s = form.string(from: date1, to: date2) 
+0

Grazie per le risposte. Un'ultima domanda se ho bisogno di separare i numeri dell'anno mese e giorno dalla stringa è la funzione inbuilt o devo passare attraverso la stringa uno per uno. Ad es .: s = "1 anno 2 mesi 3 giorni" qual è il modo più semplice per estrarre 1, 2 e 3 – alanvabraham

+0

@alanvabraham: Come ho detto, se hai bisogno di anno/mese/giorno numericamente allora è meglio usare NSDateComponents come in http: //stackoverflow.com/questions/24723431/swift-days-between-two-nsdates o la risposta di Rajan e non un NSDateComponentsFormatter. –

+0

nella risposta sopra s restituisce per es .: 1 anno 2 mesi 3 giorni. Mi piacerebbe sapere se c'è qualche funzione per estrarre questi numeri dalla stringa. Capisco che la funzione delle unità consentite restituisca le singole unità, ma la risposta non è la stessa in entrambi i casi. – alanvabraham

0

Prova thi s uno

func calculateDiffInTwoDate (date1: NSDate, date2: NSDate) -> NSInteger { 

     //var userAge : NSInteger = 0 
     let calendar : NSCalendar = NSCalendar.currentCalendar() 
     let unitFlags : NSCalendarUnit = [ .Year , .Month, .Day] 
     let dateComponentNow : NSDateComponents = calendar.components(unitFlags, fromDate: date2) 
     let dateComponentBirth : NSDateComponents = calendar.components(unitFlags, fromDate: date1) 

     if ((dateComponentNow.month < dateComponentBirth.month) || 
      ((dateComponentNow.month == dateComponentBirth.month) && (dateComponentNow.day < dateComponentBirth.day)) 
      ) 
     { 
      return dateComponentNow.year - dateComponentBirth.year - 1 
     } 
     else { 
      return dateComponentNow.year - dateComponentBirth.year 
     } 
    } 

In questo modo si può ottenere diff tra due date in anni

+0

Perché lo stai rendendo così difficile? NSCalendar può calcolare i componenti da una data a un'altra data. componenti: fromdate: TODATE: opzioni :. – gnasher729

8

Possiamo usare questa funzione in Swift 2,0

func daysBetweenDate(startDate: NSDate, endDate: NSDate) -> Int 
{ 
    let calendar = NSCalendar.currentCalendar() 

    let components = calendar.components([.Year], fromDate: startDate, toDate: endDate, options: []) 

    return components.year 
} 

È possibile tornare qualcosa di simile sono tornato anno in questa funzione Ciò restituirà il numero di anni tra le due date.
È possibile scrivere solo mesi, giorni ecc. Per trovare la differenza tra le due date rispettivamente in mesi e giorni.

Modifica

Swift 3,0

func daysBetweenDate(startDate: Date, endDate: Date) -> Int { 

    let calendar = NSCalendar.current 

    let components = calendar.dateComponents([.year], from: startDate, to: endDate) 

    return components.year! 
} 
+0

L'unica risposta corretta finora. – gnasher729

0

Perché non si utilizza il metodo inbuild per trovare la differenza tra le 2 date in pochi secondi, e poi scrivere un metodo per convertire secondi in termini di anni, mesi e giorni.

let diff = date1.timeIntervalSinceDate(date2) 
+0

Vedere il mio commento sopra: quando si calcola l'intervallo di tempo in secondi, si perdono informazioni. I mesi dovrebbero avere diverse lunghezze. Così fanno giorni. Così fanno anni. – gnasher729

+0

Quindi dovresti usare la risposta di Rajan qui sotto. – Nishant