2

我正在使用下面的代码尝试使用当前系统时间来告诉我数组中的下一次时间。它注销的只是数组中的最后一个数字。我已经搜索过了,这就是我最终到达的位置,但永远无法让它正常工作。谢谢

self.array = @[@"00:15", @"01:35, "@"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55"];


NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"HH:mm"];
NSDate *formattedCurrentDate = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]];

for(NSString *stringTime in self.array) {
    NSDate *dateFromString = [dateFormat dateFromString:stringTime];
    if([formattedCurrentDate earlierDate:dateFromString]) {
        self.nextTime.text = stringTime;
    }


}
4

4 回答 4

1

您的代码的行为与应有的完全一样,您让它返回的时间早于当前时间,这意味着每次都分配给 self.nextTime.text,但您只会看到最后一个分配,即最后一项在数组中。

此外,如果正确执行,您的if语句始终返回 true,因此除非您提供不是 NSDate 的对象,否则您将始终返回 true。

这是获得您想要的东西而不必担心订购阵列的正确方法。

NSArray *array = @[@"16:40", @"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55", @"23:55", @"01:35"];

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"HH:mm"];

NSDate *formattedCurrentDate = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]];

NSDate *laterDate;
NSDate *closestDate;

for(NSString *stringTime in array) {
    NSDate *dateFromString = [dateFormat dateFromString:stringTime];
    laterDate = [formattedCurrentDate laterDate:dateFromString];
    if(![laterDate isEqualToDate:formattedCurrentDate]){
        closestDate = [laterDate earlierDate:closestDate];
    }
}
NSLog(@"Closest Date: %@", [dateFormat stringFromDate:closestDate] );
于 2013-08-07T03:26:31.840 回答
0

如果您想要一个更通用的解决方案,它不依赖于数组的顺序,您可以使用下面的代码:

NSArray *array = @[@"02:25", @"01:35", @"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55", @"23:55"];

NSDateFormatter *dateFormat = [NSDateFormatter new];
[dateFormat setDateFormat:@"HH:mm"];

NSDate *formattedCurrentDate = [dateFormat dateFromString:[dateFormat stringFromDate:[NSDate date]]];
NSTimeInterval currentInterval = [formattedCurrentDate timeIntervalSince1970];
NSTimeInterval smallerInterval = CGFLOAT_MAX;

for(NSString *stringTime in array) {
    NSDate *dateFromString = [dateFormat dateFromString:stringTime];
    NSTimeInterval dateFromStringInterval = [dateFromString timeIntervalSince1970];

    NSTimeInterval actualInterval = (dateFromStringInterval - currentInterval);

    if(actualInterval > 0 && actualInterval < smallerInterval){
        smallerInterval = actualInterval;
        self.nextTime.text = stringTime;
    }
}

此代码获取当前小时的最接近的下一小时,与它在数组中的索引无关。并且不需要更多的分配或任何数组排序,例如@Sandeep 解决方案(确实有效)。

解释:actualInterval 是获取所有日期与当前日期之间的秒数差。这个变量(实际上是一个双精度变量)只会对未来的时间为正(过去的时间为负)。

因此,所有代码所做的只是让未来时间之间的差异更小。我认为这是解决这种情况的最佳方法。

希望这有帮助。

于 2013-08-07T03:17:44.997 回答
0
    NSArray  *array = @[@"23:15", @"01:35", @"05:30", @"06:10", @"07:05", @"07:55", @"08:45", @"09:35", @"10:40", @"11:25", @"12:20", @"13:10", @"14:05", @"15:00", @"15:45", @"16:40", @"17:30", @"18:20", @"19:20", @"20:10", @"21:00", @"22:05", @"22:55", @"23:55"];

    NSMutableArray *datesArray = [[NSMutableArray alloc] init];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"HH:mm"];

    //Convert all strings to dates
    for (NSString *str in array)
    {

        NSDate *formattedCurrentDate = [dateFormat dateFromString: str];

        [datesArray addObject:formattedCurrentDate];
    }

    //Sort dates.
    NSArray *sortedArray = [datesArray sortedArrayUsingSelector:@selector(compare:)];

    NSString *date = [dateFormat stringFromDate:[NSDate date]];
    NSDate *formattedTodatDate = [dateFormat dateFromString:date];

    //Print the desired date
    for(NSDate *stringTime in sortedArray)
    {
        if([formattedTodatDate compare:stringTime] == NSOrderedAscending)
        {
            NSLog(@"Result is %@", [dateFormat stringFromDate:stringTime]);
            break;
        }
    }

试试上面的代码。我只是按照其他人提到的排序日期。

于 2013-08-07T04:55:16.550 回答
-1

如果您的功能正常。改变:

for(NSString *stringTime in self.array) {
    NSDate *dateFromString = [dateFormat dateFromString:stringTime];
    if([formattedCurrentDate earlierDate:dateFromString]) {
        self.nextTime.text = stringTime;
    }
}

到:

for(NSString *stringTime in self.array) {
    NSDate *dateFromString = [dateFormat dateFromString:stringTime];
    if([formattedCurrentDate compare:dateFromString] == NSOrderedAscending) {
        self.nextTime.text = stringTime;
        break;
    }
}
于 2013-08-07T03:32:45.910 回答