【问题标题】:Why is the output saying null when I try to output the closest time?当我尝试输出最接近的时间时,为什么输出显示为空?
【发布时间】:2014-05-07 17:53:16
【问题描述】:

输出是:

测试首班车时间:2000-01-01 11:40:00 +0000

最近的时间:(null)

为什么我设置为 6:40 时数组中的第一个巴士时间显示为 11:40?为什么最后它说空?谢谢。

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

【问题讨论】:

  • 因为您的所有时间值都将早于“currentTime”。
  • (提示:NSLog 你的时间值之一。)
  • 哦,它们都在 2000 年。我如何让 NSDate 忽略年、月和日?我只关心小时、分钟、秒
  • 嗯,这就是我建议不要使用 NSDate 的原因之一。
  • (你不应该像那样对 NSDate 时区感到厌烦。)

标签: ios objective-c nsdate


【解决方案1】:

这样做:

转储 NSDates 数组并保留一个 NSStrings 数组。

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

(请注意,我没有更改循环中的逻辑,这看起来有点可疑,这取决于您是否假设数据是有序的。)

另一种方法:

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

(当然,在你能解释它的作用之前,你不能使用上面的方案。)

【讨论】:

  • 哦! NSString 中的比较方法.. 我现在看到了。谢谢!!我觉得很傻
  • 我又来了:P 现在我无法获取 nowDate 和最接近时间之间的秒数。我不确定如何获取下一个最近的公共汽车和当前时间之间的秒差。
  • 好吧,你可以看看我在你之前的(几乎相同的)问题中的评论。
  • 关于算术的那个??
  • 我知道如何用数字做算术,但这是一个字符串?
【解决方案2】:

NSDate 存储在 GMT 中。

当您调用 NSLog 时,它会以 GMT 格式输出日期,如果您设备上的时区不是 GMT,则不会考虑这一点。

尝试记录这个

NSString *localDate = [NSDateFormatter localizedStringFromDate:bus500_monday_To_Friday_T1 dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle];

【讨论】:

  • 我不想要任何时区吗?我希望数组中的时间保持不变。
  • 我不明白你的意思,你不能使用 NSDate 并且它没有时区,不管你喜欢与否,它都有一个。它默认有 GMT,您不能将其设置为根本没有。你的意思是你想以独立于时区的方式存储你的日期吗?你实际上是 - 时区在格式化供人类消费时发挥作用。你需要做大量的背景调查,一般来说,在 iOS 中处理日期是一件复杂的事情。
  • 哦,好的。如何将其设置为我的本地时区(我认为本地是指 iOS 设备上的时区,还是那个系统?)我发现以下代码用于更改日期格式化程序中的时区:formatter.timeZone = [NSTimeZone timeZoneWithName:@"Europe/Budapest"] 这只是欧洲的一个例子,但我怎样才能让它从 iOS 设备中获取时区?我想使用 iOS 设备当前设置的时区。我不确定用什么替换字符串“Europe/Budapest”。
  • 如果你搜索的话,会有很多问题
猜你喜欢
  • 2019-01-28
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
相关资源
最近更新 更多