Question

The output is:

Testing first bus time: 2000-01-01 11:40:00 +0000

Closest time: (null)

Why is the first bus time in my array saying it is 11:40 when I set it as 6:40? And why at the end is it saying null? Thank you.

        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
        NSDate *bus500_monday_To_Friday_T3 = [formatter dateFromString:@"08:20:00"]; // 8:20 AM
        NSDate *bus500_monday_To_Friday_T4 = [formatter dateFromString:@"08:50:00"]; // 8:50 AM
        NSDate *bus500_monday_To_Friday_T5 = [formatter dateFromString:@"09:20:00"]; // 9:20 AM
        NSDate *bus500_monday_To_Friday_T6 = [formatter dateFromString:@"09:50:00"]; // 9:50 AM
        NSDate *bus500_monday_To_Friday_T7 = [formatter dateFromString:@"10:20:00"]; // 10:20 AM
        NSDate *bus500_monday_To_Friday_T8 = [formatter dateFromString:@"10:50:00"]; // 10:50 AM
        NSDate *bus500_monday_To_Friday_T9 = [formatter dateFromString:@"11:20:00"]; // 11:20 AM
        NSDate *bus500_monday_To_Friday_T10 = [formatter dateFromString:@"11:50:00"]; // 11:50 AM
        NSDate *bus500_monday_To_Friday_T11 = [formatter dateFromString:@"12:20:00"]; // 12:20 PM
        NSDate *bus500_monday_To_Friday_T12 = [formatter dateFromString:@"12:50:00"]; // 12:50 PM
        NSDate *bus500_monday_To_Friday_T13 = [formatter dateFromString:@"13:20:00"]; // 1:20 PM
        NSDate *bus500_monday_To_Friday_T14 = [formatter dateFromString:@"13:50:00"]; // 1:50 PM
        NSDate *bus500_monday_To_Friday_T15 = [formatter dateFromString:@"14:20:00"]; // 2:20 PM
        NSDate *bus500_monday_To_Friday_T16 = [formatter dateFromString:@"14:50:00"]; // 2:50 PM
        NSDate *bus500_monday_To_Friday_T17 = [formatter dateFromString:@"15:20:00"]; // 3:20 PM
        NSDate *bus500_monday_To_Friday_T18 = [formatter dateFromString:@"15:50:00"]; // 3:50 PM
        NSDate *bus500_monday_To_Friday_T19 = [formatter dateFromString:@"16:20:00"]; // 4:20 PM
        NSDate *bus500_monday_To_Friday_T20 = [formatter dateFromString:@"16:50:00"]; // 4:50 PM
        NSDate *bus500_monday_To_Friday_T21 = [formatter dateFromString:@"17:20:00"]; // 5:20 PM
        NSDate *bus500_monday_To_Friday_T22 = [formatter dateFromString:@"17:50:00"]; // 5:50 PM
        NSDate *bus500_monday_To_Friday_T23 = [formatter dateFromString:@"18:20:00"]; // 6:20 PM
        NSDate *bus500_monday_To_Friday_T24 = [formatter dateFromString:@"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 dateWithTimeInterval:[[NSTimeZone localTimeZone] secondsFromGMT]
                                                 sinceDate:[NSDate date]];;
        NSDate *closestTime500;

        for(NSDate *date in bus500Times)
        {
            if([date timeIntervalSinceDate:currentTime] > 0)
            {
                closestTime500 = date;
                break;
            }
        }

        NSLog(@"Testing first bus time: %@", bus500_monday_To_Friday_T1);
        NSLog(@"Closest time: %@", closestTime500);
Was it helpful?

Solution

Do this:

Dump the array of NSDates and keep an array of NSStrings instead.

NSArray* busTimes = @[@"06:40:00", @"07:50:00", ...];

NSDateFormatter* fmtr = [[NSDateFormatter alloc] init];
[fmtr setFormat:@"HH:mm:ss"];
NSDate nowDate = [NSDate date];
NSString* nowString = [fmtr stringFromDate:nowDate];

NSString* closestTime = nil;

for (NSString* busTime in busTimes) {
    if ([busTime compare:nowString] == NSOrderedDescending ) {
        closestTime = busTime;
        break;
    }
}

(Note that I haven't changed the logic in loop, which appears a bit suspicious, depending on whether you assume the data is ordered or not.)

Another way to do it:

NSArray* busTimes = @[@"06:40:00", @"07:50:00", ...];
NSDateFormatter* fmtr = [[NSDateFormatter alloc] init];
[fmtr setFormat:@"HH:mm:ss"];
NSMutableArray* busMinutes = [NSMutableArray array];
for (NSString* time in busTimes) {
    NSTimeInterval doubleTime = [[fmtr dateFromString:time] timeIntervalSinceReferenceDate];
    [busMinutes addObject: [NSNumber numberWithDouble:doubleTime]];
}

NSDate* nowDate = [NSDate date];
NSString* nowString = [fmtr stringFromDate:nowDate];
NSDate* nowDate2 = [fmtr dateFromString:nowString];
NSTimeInterval nowInterval = [nowDate2 timeIntervalSinceReferenceDate];
double closestTime = 0.0;
double secondsDifference = -99.0;

for (NSNumber* busMinute in busMinutes) {
    double busInterval = [busMinutes doubleValue];
    if (busInterval > nowInterval) {
        closestTime = busInterval;
        secondsDifference = busInterval - nowInterval;
    }
}

(Of course, you can't use the above scheme until you can explain what it does.)

OTHER TIPS

NSDate is stored in GMT.

When you call NSLog it outputs the date in GMT, if your timezone on the device is not GMT then that is not being taken into consideration.

Try logging this

NSString *localDate = [NSDateFormatter localizedStringFromDate:bus500_monday_To_Friday_T1 dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top