Wie berechne ich die Anzahl der Monate zwischen zwei Daten mit Cocoa?Bestimmen Sie die Anzahl der Monate zwischen zwei Daten mit Cocoa
Danke, Stan
Wie berechne ich die Anzahl der Monate zwischen zwei Daten mit Cocoa?Bestimmen Sie die Anzahl der Monate zwischen zwei Daten mit Cocoa
Danke, Stan
Blick auf NSCalendars components:fromDate:toDate:options Methode. Es ermöglicht Ihnen, Termine zu subtrahieren und extrahieren Sie die Monate Eigenschaftswert
NSInteger month = [[[NSCalendar currentCalendar] components: NSCalendarUnitMonth
fromDate: yourFirstDate
toDate: yourSecondDate
options: 0] month];
Komponenten: VonDatum: toDate: Optionen nicht korrekt für folgende Beispiel funktioniert:
beginnen Datum: 1. Januar 2012 Enddatum : 31. März 2012
num Monate obigen Verfahren unter Verwendung von = 2
Die richtige Antwort sollte 3 Monate sein.
Ich verwende den langen Weg der Berechnungen wie folgt: 1. Finden Sie die Anzahl der Tage im Anfangsmonat. Fügen Sie es dem Bruchteil des Monats hinzu. Wenn das erste Datum der Anfang des Monats ist, zählen Sie es als vollen Monat. 2. Finden Sie die Anzahl der Tage im Endmonat. Fügen Sie es dem Bruchteil des Monats hinzu. Wenn das Datum der letzte des Monats ist, zählen Sie es als vollen Monat. 3. Finden Sie die ganzen/vollen Monate zwischen den 2 Daten und fügen Sie sie zum ganzzahligen Teil des Monats hinzu. 4. Fügen Sie die Ganzzahl & Teile der Monate hinzu, um einen korrekten Wert zu erhalten.
Um eine Antwort zu erhalten, die verwendet werden können, die Teil eines Monats folgendes beinhaltet:
- (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)];
}
ich die Monate Änderungen zwischen zwei Daten berechnen musste. Dies bedeutet, dass vom 31. Januar bis 1. Februar 1 Monat vergangen ist, NSCalendar.components
wird 0 zurückgeben.
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!")
}
}
Genau was ich brauchte - danke. –