2009-09-28 19 views

risposta

34
NSInteger month = [[[NSCalendar currentCalendar] components: NSCalendarUnitMonth 
                fromDate: yourFirstDate 
                toDate: yourSecondDate 
                options: 0] month]; 
+0

Esattamente quello di cui avevo bisogno - grazie. –

0

componenti: fromdate: TODATE: opzioni non funziona correttamente per esempio seguente:

data iniziale: 1 Gennaio 2012 la data di fine : il 31 marzo 2012.

num di mesi utilizzando sopra method = 2

La risposta corretta dovrebbe essere di 3 mesi.

Sto utilizzando il lungo metodo di calcolo come segue: 1. Trova il numero di giorni nel mese di inizio. Aggiungilo alla parte frazione del mese. Se la prima data è l'inizio del mese, contarlo come mese intero. 2. trova il numero di giorni nel mese finale. Aggiungilo alla parte frazione del meseSe la data è l'ultimo del mese, conta come un mese intero. 3. Trova i mesi interi/completi tra le 2 date e aggiungi alla parte intera del mese. 4. Aggiungere il numero intero & parti di frazione dei mesi per ottenere un valore corretto.

5

Per ottenere una risposta che include la frazione di un mese, i seguenti può essere utilizzato:

- (NSNumber *)numberOfMonthsBetweenFirstDate:(NSDate *)firstDate secondDate:(NSDate *)secondDate { 

if ([firstDate compare:secondDate] == NSOrderedDescending) { 
    return nil; 
} 

NSCalendar *calendar = [NSCalendar currentCalendar]; 

NSDateComponents *firstDateComponents = [calendar components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
                fromDate:firstDate]; 

NSInteger firstDay = [firstDateComponents day]; 

NSRange rangeOfFirstMonth = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:firstDate]; 
NSUInteger numberOfDaysInFirstMonth = rangeOfFirstMonth.length; 
CGFloat firstMonthFraction = (CGFloat)(numberOfDaysInFirstMonth - firstDay)/(CGFloat)numberOfDaysInFirstMonth; 

// last month component 
NSDateComponents *lastDateComponents = [calendar components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit 
                   fromDate:secondDate]; 
NSInteger lastDay = [lastDateComponents day]; 
NSRange rangeOfLastMonth = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:secondDate]; 
NSUInteger numberOfDaysInLastMonth = rangeOfLastMonth.length; 
CGFloat lastMonthFraction = (CGFloat)(lastDay)/(CGFloat)numberOfDaysInLastMonth; 

// Check if the two dates are within the same month 
if (firstDateComponents.month == lastDateComponents.month 
     && firstDateComponents.year == lastDateComponents.year) { 
    NSDateComponents *dayComponents = [calendar components:NSDayCalendarUnit 
                  fromDate:firstDate 
                  toDate:secondDate 
                  options:0]; 

    NSRange rangeOfMonth = [calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:firstDate]; 
    NSUInteger numberOfDaysInMonth = rangeOfMonth.length; 
    return [NSNumber numberWithFloat:(CGFloat)dayComponents.day/(CGFloat)numberOfDaysInMonth]; 
} 

// Start date of the first complete month 
NSDateComponents *firstDateFirstDayOfNextMonth = firstDateComponents; 
firstDateFirstDayOfNextMonth.month +=1; 
firstDateFirstDayOfNextMonth.day = 1; 

// First day of the last month 
NSDateComponents *secondDateFirstDayOfMonth = lastDateComponents; 
secondDateFirstDayOfMonth.day = 1; 

NSInteger numberOfMonths = secondDateFirstDayOfMonth.month - firstDateFirstDayOfNextMonth.month 
     + (secondDateFirstDayOfMonth.year - firstDateFirstDayOfNextMonth.year) * 12; 

return [NSNumber numberWithFloat:(firstMonthFraction + numberOfMonths + lastMonthFraction)]; 
} 
1

ho dovuto calcolare i mesi cambiamenti tra due date. Ciò significa che dal 31 gennaio al 1 ° febbraio è passato 1 mese NSCalendar.components restituirà 0.

import UIKit 

func monthsSince(from: NSDate, to: NSDate) -> Int { 
    let fromComponents = NSCalendar.currentCalendar().components([.Month, .Year], fromDate: from) 
    let toComponents = NSCalendar.currentCalendar().components([.Month, .Year], fromDate: to) 

    return ((toComponents.year - fromComponents.year) * 12) + (toComponents.month - fromComponents.month) 
} 

let tests = [ 
    (from: (day: 1, month: 1, year: 2016), to: (day: 31, month: 1, year: 2016), result: 0), 
    (from: (day: 22, month: 1, year: 2016), to: (day: 5, month: 2, year: 2016), result: 1), 
    (from: (day: 22, month: 12, year: 2015), to: (day: 1, month: 1, year: 2016), result: 1), 
    (from: (day: 1, month: 1, year: 2016), to: (day: 1, month: 2, year: 2016), result: 1), 
    (from: (day: 1, month: 1, year: 2016), to: (day: 1, month: 3, year: 2016), result: 2) 
] 

for test in tests { 
    let from = NSCalendar.currentCalendar().dateWithEra(1, year: test.from.year, month: test.from.month, day: test.from.day, hour: 0, minute: 0, second: 0, nanosecond: 0)! 
    let to = NSCalendar.currentCalendar().dateWithEra(1, year: test.to.year, month: test.to.month, day: test.to.day, hour: 0, minute: 0, second: 0, nanosecond: 0)! 

    if monthsSince(from, to: to) == test.result { 
     print("Test \(test), Passed!") 
    } else { 
     print("Test \(test), Failed!") 
    } 
} 
Problemi correlati