2010-07-28 9 views
5

एक तिथि से दूसरे में लूप का सबसे आसान तरीका क्या है?आईफोन पर दो एनएसडीट्स के बीच लूप करने का सबसे आसान तरीका?

for (NSDate *date = [[startDate copy] autorelease]; [date compare: endDate] < 0; 
    date = [date dateByAddingDays: 1]) { 
    // do stuff here 
} 

यह काम नहीं करता, ज़ाहिर है:

मैं धारणात्मक क्या चाहते हैं कुछ इस तरह है कोई dateByAddingDays:। और यहां तक ​​कि अगर ऐसा होता है, तो यह अपने विनाश के लिए इंतजार कर रहे ऑटोरेलेज्ड वस्तुओं का एक विस्तृत निशान छोड़ देगा।

यहाँ मैं क्या के बारे में सोचा है या नहीं:

  • मैं सिर्फ एक NSTimeInterval नहीं जोड़ सकते हैं, के बाद से एक दिन में सेकंड की संख्या भिन्न हो सकते हैं।
  • मैं इसे NSDateComponents में तोड़ सकता हूं और घटकों को एक दिन जोड़ सकता हूं, फिर इसे फिर से इकट्ठा कर सकता हूं। लेकिन यह लंबा और बदसूरत कोड है।

तो मुझे आशा है कि किसी ने इसके लिए कुछ विकल्प आज़माए हैं, और एक अच्छा पाया है। कोई विचार?

+0

ठीक है, पकड़ यह है कि कोई तारीख नहीं है। :) –

उत्तर

3

एक DATERANGE वर्ग के लिए तेजी से गणना करें:

- (NSUInteger)countByEnumeratingWithState: (NSFastEnumerationState *)state 
            objects: (id *)stackbuf 
            count: (NSUInteger)len; 
{ 
    NSInteger days = 0; 
    id current = nil; 
    id components = nil; 
    if (state->state == 0) 
    { 
     current = [NSCalendar currentCalendar]; 
     state->mutationsPtr = &state->extra[0]; 
     components = [current components: NSDayCalendarUnit 
           fromDate: startDate 
            toDate: endDate 
           options: 0]; 
     days = [components day]; 
     state->extra[0] = days; 
     state->extra[1] = (uintptr_t)current; 
     state->extra[2] = (uintptr_t)components; 
    } else { 
     days = state->extra[0]; 
     current = (NSCalendar *)(state->extra[1]); 
     components = (NSDateComponents *)(state->extra[2]); 
    } 
    NSUInteger count = 0; 
    if (state->state <= days) { 
     state->itemsPtr = stackbuf; 
     while ((state->state <= days) && (count < len)) { 
      [components setDay: state->state]; 
      stackbuf[count] = [current dateByAddingComponents: components 
                 toDate: startDate 
                 options: 0]; 
      state->state++; 
      count++; 
     } 
    } 
    return count; 
} 

यह बदसूरत है, लेकिन कुरूपता मेरी तिथि सीमा वर्ग तक ही सीमित है। मेरे क्लाइंट कोड सिर्फ है:

for (id date in dateRange) { 
    NSLog(@"%@ in [%@,%@]", date, startDate, endDate); 
} 

मुझे लगता है कि यह शायद एक अच्छा पर्याप्त कारण यदि आपके पास पहले से नहीं है एक DATERANGE वर्ग तैयार करना है।

7

एक Oneday तारीख घटक लगातार सेट करें और बार-बार इसे जोड़ने:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
    NSDateComponents *oneDay = [[NSDateComponents alloc] init]; 
    [oneDay setDay: 1]; 

    for (id date = [[startDate copy] autorelease]; [date compare: endDate] <= 0; 
     date = [calendar dateByAddingComponents: oneDay 
             toDate: date 
             options: 0]) { 
     NSLog(@"%@ in [%@,%@]", date, startDate, endDate); 
    } 

यह अभी भी autoreleased वस्तुओं के निशान छोड़ देता है, लेकिन dateByAddingComponents:toDate:options: जिम्मेदार है। यकीन नहीं है कि इसके बारे में कुछ भी किया जा सकता है।

4

दिनांक = [दिनांक दिनांक ByAddingTimeInterval: 24 * 60 * 60] के बजाय कैसे?

for (NSDate *date = [[startDate copy] autorelease]; [date compare: endDate] < 0; 
date = [date dateByAddingTimeInterval:24 * 60 * 60]) { 
    NSLog(@"%@ in [%@,%@]", date, startDate, endDate); 
} 
+1

यह एक अच्छी शुरुआत है, लेकिन ज्यादातर समय क्षेत्रों में डेलाइट बचत समय के कारण अलग-अलग घंटों के साथ प्रति वर्ष कुछ दिन होते हैं। अगर मेरा समय आधी रात के करीब है, तो इससे कोई फर्क पड़ सकता है। उदाहरण के लिए, 12:05 पूर्वाह्न उसी दिन 11:05 बजे हो सकता है। 11:05 अपराह्न रविवार मंगलवार को 1:05 बजे हो सकता है। –

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