2014-01-08 139 views
0

我有兩個日期字符串,我想獲取日期之間。 例如,ios - 在日期之間(在實際日期中,不是天數)

NSString *startDate = @"25-01-2014"; 
NSString *endDate = @"02-02-2014"; 

在日期之間將是(26-01-2014,27-01-2014,28-01-2014 .......) 優選包括startDateendDate,以及。我設法找到的大部分問題都要求提供多少天。但我需要它是實際的日期。無論如何,我可以得到日期之間的?

NSString *start = @"2010-09-01"; 
NSString *end = @"2010-12-05"; 

NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateFormat:@"yyyy-MM-dd"]; 
NSDate *startDate = [f dateFromString:start]; 
NSDate *endDate = [f dateFromString:end]; 

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit 
                fromDate:startDate 
                 toDate:endDate 
                options:0]; 

NSLog(@"Difference in date components: %d", components.day); 

我設法找到這隻返回天數差異。

+0

你想獲得startDate和endDate之間的日期列表嗎? (startDate,endDate)? – KudoCC

+0

是的。我想得到那個日期列表。以下提供的答案都是正確的,並返回日期列表。 –

回答

9
NSString *start = @"2010-09-01"; 
NSString *end = @"2010-12-05"; 

NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
[f setDateFormat:@"yyyy-MM-dd"]; 
NSDate *startDate = [f dateFromString:start]; 
NSDate *endDate = [f dateFromString:end]; 

NSMutableArray *dates = [@[startDate] mutableCopy]; 


NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit 
                fromDate:startDate 
                 toDate:endDate 
                options:0]; 

for (int i = 1; i < components.day; ++i) { 
    NSDateComponents *newComponents = [NSDateComponents new]; 
    newComponents.day = i; 

    NSDate *date = [gregorianCalendar dateByAddingComponents:newComponents 
                 toDate:startDate 
                options:0]; 
    [dates addObject:date]; 
} 

[dates addObject:endDate]; 

陣列dates現在包含startDateendDate,包括,用於在午夜設備的時區之間的日期列表。
請注意,在某些時區,這可能會造成麻煩,因爲此時可能會發生從夏令時切換到夏令時,請參閱WWDC 2011 Video "Session 117 - Performing Calendar Calculations"以獲取更多信息。一個訣竅是將小時轉移到保存時間,即中午,進行計算並減去12小時。

+0

我測試了這一點,它的工作原理。它返回了日期列表,並感謝您提供有關時區的指針。對不起,我已經接受鄧肯C的答案。但你仍然感激我。 –

+0

好吧。實際上你是對的。對於回答這個問題的雙方我很抱歉。應該看到時差...... –

+0

你救了我的日子。完美運作。 –

1

好吧,你大部分的方式。你有一個日期格式化程序將日期字符串轉換爲NSDates。您有日期之間的天數。現在您需要從多天的開始日期開始循環,並在開始日期添加可變天數。

你需要的方法是dateByAddingComponents:toDate:options :.

像這樣的東西(你的代碼後,會立即轉到):

int days = components.day; 

    NSDateComponents *daysToAdd = [[NSDateComponents alloc] init]; 
    for (int count = 0; count <= days; count++) 
    { 
    daysToAdd.day = count; 
    NSDate *loopDate = [gregorianCalendar dateByAddingComponents: daysToAdd 
                 toDate: startDate 
                 options: 0 ]; 
    NSLog(@"Day %d = %@", count+1, [f stringFromDate: loopDate]); 
    } 

我沒有測試過,但是這是基本的想法...

上面的代碼應包括起始和結束日期。

如果你不想加入開始日期,請在計數循環開始= 1而不是數= 0

如果你不希望包括結束日期,使循環檢查計數<天。

+0

謝謝Duncan C.它的工作,這返回我需要的結果。 –

0

有點晚了,但找到了vikingosegundo在他的回答中談到的'TIMEZONE'時間問題的修復。我只是轉換了的NSDate到一個NSString通過調用格式化* F一stringFromDate方法在你的for循環...

for (int i = iStart; i < components.day; ++i) { 
    NSDateComponents *newComponents = [NSDateComponents new]; 
    newComponents.day = i; 
    newComponents.hour = 0; 
    newComponents.minute = 0; 
    newComponents.second = 0; 

    NSDate *date = [gregorianCalendar dateByAddingComponents:newComponents 
                 toDate:startDate 
                options:0]; 
    // THIS IS THE CODE I ADDED TO MINE // 
    // convert NSDate to string calling on *f (NSDateformatter) 
    NSString *string = [f stringFromDate:date]; 
    // split the string to separate year, month, etc... 
    NSArray *array = [string componentsSeparatedByString:@"-"]; 
    // create second NSString withFormat and only add the variable from the date that you find pertinent 
    NSString *sDateNew = [NSString stringWithFormat:@"%@-%@-%@",array[0],array[1],array[2]]; 
    // then simply add the sDateNew string to dates array 
    [dates addObject:sDateNew]; 
} 

我想這應該是把你的答案vikingsegundo的註釋部分,但它不會讓我。

相關問題