2012-09-04 11 views
8

मुझे कोड दोके बीच दिनों के अंतर की गणना करने के लिए मिला।किसी विशेष टाइमज़ोन में दो एनएसडीएटी तिथियों के बीच दिनों की संख्या प्राप्त करें

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate 
{ 
    NSCalendar *gregorian = [[NSCalendar alloc] 
          initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit 
              inUnit: NSEraCalendarUnit forDate:startDate]; 
    NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit 
              inUnit: NSEraCalendarUnit forDate:endDate]; 
    return endDay-startDay; 
} 

इस विधि एक समस्या है: यह समय क्षेत्र बात पर विचार नहीं कर सकते
मैं एक विधि लिखें। यहां तक ​​कि मैं इस तरह एक पंक्ति जोड़ें:

[gregorian setTimeZone:[NSTimeZone localTimeZone]]; 

मेरे परीक्षण कोड इस तरह है:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 
    NSString *strDate = @"2012-09-03 23:00:00"; 
    NSDate *dateStart = [dateFormat dateFromString:strDate]; 
    strDate = @"2012-09-04 01:00:00"; 
    NSDate *dateEnd = [dateFormat dateFromString:strDate]; 
    NSLog(@"Days difference between %@ and %@ is: %d days",[dateFormat stringFromDate:dateStart],[dateFormat stringFromDate:dateEnd],[self daysWithinEraFromDate:dateStart toDate:dateEnd]); 

परिणाम है: 2012-09-03 23:00 के बीच

दिन का अंतर : 00 और 2012-09-04 01:00:00 है: 0 दिन

मैं मिडनिग की संख्या के परिणामस्वरूप 1 दिन प्राप्त करना चाहता हूं दो तिथियों के बीच hts। मेरा टाइमज़ोन जीएमटी +8 है। लेकिन यह गणना जीएमटी पर आधारित है, इसलिए मुझे गलत दिन संख्या मिलती है। क्या इस समस्या के समाधान का कोई तरीका है? धन्यवाद।


Scott Lemmon की विधि मेरी समस्या का समाधान कर सकती है। मैं इस तरह मेरे कोड को फिर से लिखने:

-(NSInteger)daysWithinEraFromDate:(NSDate *) startDate toDate:(NSDate *) endDate 
{ 
    NSCalendar *gregorian = [[NSCalendar alloc] 
          initWithCalendarIdentifier:NSGregorianCalendar]; 
    [gregorian setTimeZone:[NSTimeZone localTimeZone]]; 
    NSDate *newDate1 = [startDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]]; 
    NSDate *newDate2 = [endDate dateByAddingTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]]; 

    NSInteger startDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit 
              inUnit: NSEraCalendarUnit forDate:newDate1]; 
    NSInteger endDay=[gregorian ordinalityOfUnit:NSDayCalendarUnit 
              inUnit: NSEraCalendarUnit forDate:newDate2]; 
    return endDay-startDay; 
} 

उत्तर

5

यदि समय क्षेत्र ऑफसेट काम नहीं कर रहा है, तो इसके बजाय मैन्युअल रूप से इसे जोड़ने या घटाने के बारे में कैसे?

आपके मामले में NSDate *newDate = [oldDate dateByAddingTimeInterval:(-8 * 60 * 60)]; अपने +8 घंटे घटाने के लिए।

या यदि आप जीएमटी लगाना चाहते हैं स्वतः ही भरपाई उसके बाद यह सामान्य हो जाएगा NSDate *newDate = [oldDate dateByAddingTimeInterval:(-[[NSTimeZone localTimeZone] secondsFromGMT])

एक और सोचा: एक शायद आसान समाधान सिर्फ समय की जानकारी पूरी तरह उपेक्षा होगी। बस इसे दोनों तिथियों के लिए एक ही मनमाना संख्या पर सेट करें, तब तक जब तक तारीखें उसी समय क्षेत्र से आती हैं, तब तक आप जीएमटी ऑफ़सेट के बावजूद, मध्य बीच की सही संख्या को हमेशा प्राप्त करेंगे।

+0

हाय, आपके उत्तर के लिए धन्यवाद। मैंने बस समय की जानकारी को अनदेखा करने के बारे में सोचा। मैंने इसे अपने कोड में किया है। लेकिन आपका पहला समाधान शानदार है! मुझे लगता है कि यह इस समस्या को हल करने का एक और सटीक तरीका है। मैंने इसे अपने कोड में आजमाया है, मैं उन्हें दिखाऊंगा। – Vigor

3

क्या आप वास्तव में चाहते हैं NSDate विधि timeIntervalSinceDate: है, और उस परिणाम लेने के लिए और अगर यह 0 से अधिक लेकिन 86400 से भी कम समय (एक दिन में सेकंड की संख्या) है, कि एक है दिन। अन्यथा, अपना परिणाम 86400 से विभाजित करें और आपको दिनों की संख्या मिल जाएगी।

जिस तरह से आपके पास वर्तमान में आपका कोड है, दो दिनों के बीच केवल 2 घंटे हैं और यही कारण है कि आप 0 का परिणाम देख रहे हैं और एक नहीं।

संपादित करें - और निर्धारित करने के लिए करता है, तो आधी रात हुआ है, चलो इस समारोह मैं सिर्फ मेरे सिर के ऊपर से लिखा था की कोशिश करते हैं:

- (NSDate *) getMidnightDateFromDate: (NSDate *) originalDate 
{ 
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSIntegerMax fromDate:originalDate]; 
    [components setHour:0]; 
    [components setMinute:0]; 
    [components setSecond:0]; 
    NSDate *midnight = [[NSCalendar currentCalendar] dateFromComponents:components]; 
    return(midnight); 
} 

- (BOOL) howManyDaysDifferenceBetween: startDate and: endDate 
{ 
    NSDate * firstMidnight = [self getMidnightDateFromDate: startDate]; 
    NSDate * secondMidnight = [self getMidnightDateFromDate: endDate]; 
    NSTimeInterval timeBetween = [firstMidnight timeIntervalSinceDate: secondMidnight]; 

    NSInteger numberOfDays = (timeBetween/86400); 

    return(numberOfDays); 
} 

जो मैं Dave Delong's answer to this question बंद आधारित कर रहा हूँ। कोई गारंटी नहीं है कि मेरा कोड काम करेगा (मैंने इसका परीक्षण नहीं किया), लेकिन मुझे लगता है कि अवधारणा ध्वनि है।

+0

आपके उत्तर के लिए धन्यवाद। मैं यह निर्धारित करना चाहता हूं कि दो तारीखों के बीच मध्यरात्रि की संख्या से दो एनएसडीएट उदाहरण विभिन्न तिथियों में हैं या नहीं। आपकी विधि के तहत, मुझे अभी भी 0 दिन मिलेगा। लेकिन 2012-09-03 और 2012-09-04 विभिन्न तिथियों में हैं, भले ही अंतराल केवल 2 घंटे है।अगर मैं दूसरी तारीख 2012-09-04 08:00:00 में बदलता हूं, तो मुझे अपनी विधि के तहत परिणाम के रूप में 1 दिन मिल जाएगा। मुझे लगता है कि यह समय है क्योंकि टाइमज़ोन। – Vigor

संबंधित मुद्दे

 संबंधित मुद्दे