2009-09-28 14 views
8

का उपयोग करके दो तिथियों के बीच महीनों की संख्या निर्धारित करें मैं कोको का उपयोग करके दो तिथियों के बीच महीनों की संख्या की गणना कैसे करूं?कोको

धन्यवाद, NSCalendars components:fromDate:toDate:options विधि पर स्टेन

उत्तर

13

देखो। fromDate: todate: विकल्प सही ढंग से निम्न उदाहरण के लिए काम नहीं करता:

प्रारम्भ दिनांक: यह आप तारीखों घटाना और फिर महीनों संपत्ति मान प्राप्त करने के

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

बिल्कुल मुझे जो चाहिए - धन्यवाद। –

0

घटकों की अनुमति देता है जनवरी 01, 2012 अंतिम तिथि नहीं : 31 मार्च विधि से ऊपर का उपयोग कर महीने की 2012

num = 2

सही उत्तर 3 महीने होना चाहिए।

मैं निम्नानुसार गणनाओं का लंबा तरीका उपयोग कर रहा हूं: 1. आरंभ माह में दिनों की संख्या पाएं। इसे महीने के अंश भाग में जोड़ें। यदि पहली तारीख महीने की शुरुआत है, तो इसे पूरे महीने के रूप में गिनें। 2. अंत महीने में दिनों की संख्या पाएं। इसे महीने के अंश भाग में जोड़ें अगर तिथि महीने का आखिरी महीना है तो इसे पूर्ण महीने के रूप में गिना जाता है। 3. 2 तिथियों के बीच पूरे/पूर्ण महीनों को ढूंढें और महीने के पूर्णांक भाग में जोड़ें। 4. सही मान प्राप्त करने के लिए महीनों के अंश भाग & पूर्णांक जोड़ें।

5

एक जवाब है कि एक महीने के अंश शामिल हैं निम्नलिखित इस्तेमाल किया जा सकता प्राप्त करने के लिए:

- (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

मैं दो तिथियों के बीच के महीनों में परिवर्तन की गणना करने के लिए किया था। इसका मतलब है कि 31 जनवरी से 1 फरवरी तक 1 महीने बीत चुका है NSCalendar.components वापस 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!") 
    } 
}