IOS – 在date之间(实际date,而不是天数)

我有两个datestring,我想要在date之间。 例如,

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

在date之间(26-01-2014,27-01-2014,28-01-2014 …….)最好包括startDateendDate 。 我设法find的大部分问题都要求提供多less天。 但我需要它是实际的date。 无论如何,我可以得到在date之间?

 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); 

我设法find这只返回天数差异。

 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之间的date列表,包括设备时区午夜的date列表。
请注意,在某些时区,这可能会造成麻烦,因为此时可能会发生切换到夏令时,请参阅WWDC 2011video“会话117 – 执行日历计算”以获取更多信息。 一个诀窍是将小时转移到保存时间,即中午,进行计算并减去12小时。

好的,你大部分都是在那里。 您有一个date格式化程序将datestring转换为NSDates。 你有date之间的天数。 现在,您需要从多天的开始date开始循环,为开始date添加可变天数。

你需要的方法是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]); } 

我没有testing过,但这是基本的想法…

上面的代码应该包括开始date和结束date。

如果您不想包含开始date,请将循环从count = 1开始,而不是count = 0。

如果您不想包含结束date,请将循环检查计为<days。

有点晚了,但find了vikingosegundo在回答中提到的'TIMEZONE'时间问题。 我只是通过在for循环中格式化程序* f上调用stringFromDate方法,将NSDate转换为NSString …

 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的评论部分,但它不会让我。