如何筛选NSDate对象的NSArray以查找下一个最近的日期?

时间:2014-05-07 15:04:52

标签: ios objective-c nsdate nsdateformatter nsdatecomponents

我正在尝试弄清楚如何过滤NSArray NSDateNSDate个对象以找到下一个最近的对象(如公交站点应用)。这一天无关紧要。 dateWithString对象中最重要的是小时和分钟,因为它每天都是相同的。

我正在尝试为iOS做这个,而且从我的研究来看,似乎没有适用于iOS的NSDateComponents方法(大部分都忽略了我的代码,只是在那里概述我想要完成的工作) )。我查看了许多内容,例如NSCalendarNSArray,但似乎无法弄明白。我只是希望能够过滤NSDateNSDate个对象来查找下一个即将到来的总线(下一个最接近的NSDate *bus500_monday_To_Friday_T1 = [NSDate dateWithString:@"06:40:00"]; // 6:40 AM NSDate *bus500_monday_To_Friday_T2 = [NSDate dateWithString:@"07:50:00"]; // 7:50 AM NSDate *bus500_monday_To_Friday_T3 = [NSDate dateWithString:@"08:20:00"]; // 8:20 AM NSDate *bus500_monday_To_Friday_T4 = [NSDate dateWithString:@"08:50:00"]; // 8:50 AM NSDate *bus500_monday_To_Friday_T5 = [NSDate dateWithString:@"09:20:00"]; // 9:20 AM NSDate *bus500_monday_To_Friday_T6 = [NSDate dateWithString:@"09:50:00"]; // 9:50 AM NSDate *bus500_monday_To_Friday_T7 = [NSDate dateWithString:@"10:20:00"]; // 10:20 AM NSDate *bus500_monday_To_Friday_T8 = [NSDate dateWithString:@"10:50:00"]; // 10:50 AM NSDate *bus500_monday_To_Friday_T9 = [NSDate dateWithString:@"11:20:00"]; // 11:20 AM NSDate *bus500_monday_To_Friday_T10 = [NSDate dateWithString:@"11:50:00"]; // 11:50 AM NSDate *bus500_monday_To_Friday_T11 = [NSDate dateWithString:@"12:20:00"]; // 12:20 PM NSDate *bus500_monday_To_Friday_T12 = [NSDate dateWithString:@"12:50:00"]; // 12:50 PM NSDate *bus500_monday_To_Friday_T13 = [NSDate dateWithString:@"13:20:00"]; // 1:20 PM NSDate *bus500_monday_To_Friday_T14 = [NSDate dateWithString:@"13:50:00"]; // 1:50 PM NSDate *bus500_monday_To_Friday_T15 = [NSDate dateWithString:@"14:20:00"]; // 2:20 PM NSDate *bus500_monday_To_Friday_T16 = [NSDate dateWithString:@"14:50:00"]; // 2:50 PM NSDate *bus500_monday_To_Friday_T17 = [NSDate dateWithString:@"15:20:00"]; // 3:20 PM NSDate *bus500_monday_To_Friday_T18 = [NSDate dateWithString:@"15:50:00"]; // 3:50 PM NSDate *bus500_monday_To_Friday_T19 = [NSDate dateWithString:@"16:20:00"]; // 4:20 PM NSDate *bus500_monday_To_Friday_T20 = [NSDate dateWithString:@"16:50:00"]; // 4:50 PM NSDate *bus500_monday_To_Friday_T21 = [NSDate dateWithString:@"17:20:00"]; // 5:20 PM NSDate *bus500_monday_To_Friday_T22 = [NSDate dateWithString:@"17:50:00"]; // 5:50 PM NSDate *bus500_monday_To_Friday_T23 = [NSDate dateWithString:@"18:20:00"]; // 6:20 PM NSDate *bus500_monday_To_Friday_T24 = [NSDate dateWithString:@"19:05:00"]; // 7:05 PM NSArray *bus500Times = @[bus500_monday_To_Friday_T1, bus500_monday_To_Friday_T2, bus500_monday_To_Friday_T3, bus500_monday_To_Friday_T4, bus500_monday_To_Friday_T5, bus500_monday_To_Friday_T6, bus500_monday_To_Friday_T7, bus500_monday_To_Friday_T8, bus500_monday_To_Friday_T9, bus500_monday_To_Friday_T10, bus500_monday_To_Friday_T11, bus500_monday_To_Friday_T12, bus500_monday_To_Friday_T13, bus500_monday_To_Friday_T14, bus500_monday_To_Friday_T15, bus500_monday_To_Friday_T16, bus500_monday_To_Friday_T17, bus500_monday_To_Friday_T18, bus500_monday_To_Friday_T19, bus500_monday_To_Friday_T20, bus500_monday_To_Friday_T21, bus500_monday_To_Friday_T22, bus500_monday_To_Friday_T23, bus500_monday_To_Friday_T24]; NSDate *currentTime; NSDate *closestTime500; while(YES) { currentTime = [NSDate dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT] sinceDate:[NSDate date]]; int i = 0; for(NSDate *date in bus500Times) { if([date timeIntervalSinceDate:currentTime] > 0) { closestTime500 = date; break; } } double negativeSecondsUntilNextBusDepart500 = [currentTime timeIntervalSinceDate:closestTime500]; // Have to get the magnitude (positive) of the negative secodns value double realSecondsUntilNextBusDepart500 = negativeSecondsUntilNextBusDepart500+((-negativeSecondsUntilNextBusDepart500)*2); // Casting seconds to an integer so modulus can happen in following code int seconds500 = (int)realSecondsUntilNextBusDepart500; // Formatting the seconds into days, hours, minutes, seconds int hours500 = seconds500/3600; seconds500 = seconds500%3600; int minutes500 = seconds500/60; seconds500 = seconds500%60; // Displaying information to the screen if(hours500 > 0) NSLog(@"%d HOURS, %d MINUTES, %d SECONDS", hours500, minutes500, seconds500); else if(minutes500 > 0) NSLog(@"%d MINUTES, %d SECONDS", minutes500, seconds500); else NSLog(@"%d SECONDS", seconds500); NSLog(@"\n"); sleep(1); } 对象)。请帮我调整我的代码。

{{1}}

2 个答案:

答案 0 :(得分:0)

使用NSDate的{​​{1}}(或-timeIntervalSinceDate:)方法查找给定日期(或当前日期)之间的差异。对阵列中的每个日期执行此操作,直到找到差异最小(和正确的符号)的日期。简单地遍历数组就行了,但另一种方法是使用-timeIntervalSinceNow的{​​{3}}方法。

答案 1 :(得分:0)

您需要使用dateWithString将字符串转换为日期,而不是您承认的NSDateFormatter

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"H:mm:ss";
NSDate *bus500_monday_To_Friday_T1 = [formatter dateFromString:@"06:40:00"]; // 6:40 AM
NSDate *bus500_monday_To_Friday_T2 = [formatter dateFromString:@"07:50:00"]; // 7:50 AM
...etc

然后,您可以使用NSDate NSDate

将当前日期与您的公共汽车时间timeIntervalSinceDate:值(或您的参考日期)进行比较