【问题标题】:How do I find the Next Closest Date to today from a list of dates in a Plist on iOS?如何从 iOS 上 Plist 中的日期列表中找到距今天最近的下一个日期?
【发布时间】:2013-11-11 21:42:39
【问题描述】:

情况:简而言之,我有一个足球赛程。我想使用一个自定义单元格,它只为时间表中的下一个比赛日期提供更多信息。

问题:我如何只找到时间表中最接近的游戏(对于 iOS)?

我观看了 WWDC 2013 视频“常见日期和时间问题的解决方案”,但这主要适用于 Mac。我在这里搜索了很多帖子,有些帖子很接近,但不是我只需要从我的日程表中的日期列表中找到下一个日期。从其他帖子中,我看到可以比较两个特定日期的位置,但这不是我想要做的。我想从日期列表中找到与今天相等或之后的下一个最接近的日期。

这就是我现在的位置。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{   
//Populate the table from the plist
NSDictionary *season = _schedContentArray[indexPath.section];
NSArray *schedule = season[@"Schedule"];  
NSDictionary *game = schedule[indexPath.row];

//find the closest game date after today's date ??
NSString *gameDateStr = game[@"GameDate"];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.calendar=calendar;
[dateFormatter setDateFormat:@"MM/dd/yy"];
NSDate *today = [NSDate date];
NSDate *gameDate = [dateFormatter dateFromString:gameDateStr];
//NSString *nextGame =
NSLog(@"game date is %@",gameDate);

NSLog 返回游戏日期(开放日期除外): 2013-11-11 16:10:05.979 克莱姆森足球[24060:70b] 比赛日期为 2013-08-31 04:00:00 +0000 2013-11-11 16:10:05.982 Clemson Football[24060:70b] 比赛日期为 2013-09-07 04:00:00 +0000 2013-11-11 16:10:05.985 Clemson Football[24060:70b] 比赛日期为 (null) 2013-11-11 16:10:05.987 Clemson Football[24060:70b] 比赛日期为 2013-09-19 04:00:00 +0000 2013-11-11 16:10:05.988 克莱姆森足球[24060:70b] 比赛日期为 2013-09-28 04:00:00 +0000 2013-11-11 16:10:05.990 Clemson Football[24060:70b] 比赛日期为 2013-10-05 04:00:00 +0000 2013-11-11 16:10:05.992 Clemson Football[24060:70b] 比赛日期为 2013-10-12 04:00:00 +0000 2013-11-11 16:10:05.993 克莱姆森足球[24060:70b] 比赛日期为 2013-10-19 04:00:00 +0000 2013-11-11 16:10:05.995 Clemson Football[24060:70b] 比赛日期为 2013-10-26 04:00:00 +0000 2013-11-11 16:10:05.996 Clemson Football[24060:70b] 比赛日期为 2013-11-02 04:00:00 +0000 2013-11-11 16:10:05.998 克莱姆森足球[24060:70b] 比赛日期为 2013-11-09 05:00:00 +0000 2013-11-11 16:10:06.000 克莱姆森足球[24060:70b] 比赛日期为 2013-11-14 05:00:00 +0000 2013-11-11 16:10:06.001 克莱姆森足球[24060:70b] 比赛日期为 2013-11-23 05:00:00 +0000 2013-11-11 16:10:06.003 Clemson Football[24060:70b] 比赛日期为 2013-11-30 05:00:00 +0000 2013-11-11 16:10:06.005 Clemson Football[24060:70b] 比赛日期为 2013-12-07 05:00:00 +0000

提前感谢您提供的任何帮助。这看起来应该很简单,但相当令人沮丧。如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: ios date plist


    【解决方案1】:

    在列表中的日期上使用[NSDate timeIntervalSinceNow],然后找出最小值的日期。

    代码可能看起来像这样(未经测试)。

    NSArray *dates = ... // your list of dates
    NSDate *closestDate = nil;
    for(NSDate *date in dates) {
        if(([date timeIntervalSinceNow] < 0) {
             // the date is in the past
             continue;
        }
        if([date timeIntervalSinceNow] < [closestDate timeIntervalSinceNow] || !closestDate) {
            closestDate = date;
        }
    }
    

    【讨论】:

    • 感谢 BlackRider 和 @Vlad 的快速响应!我尝试了 timeIntervalSinceNow 和 SincDate,我在日志中得到“interval is nan”。如果您不介意,您能否给我一个代码建议以及如何找到具有最小正值的日期(假设过去的日期为负数)?试过 NSTimeInterval timeInterval = [[NSDate date] timeIntervalSinceDate:gameDate]; NSLog(@"间隔为 %f",timeInterval);并在日志“2013-11-12 08:27:54.365 Clemson Football[26559:70b] interval is nan”中收到此消息,再次感谢!
    【解决方案2】:

    如果您有一个参考日期,并且您尝试从一组中获取距今天最近的日期,则将日期转换为时间间隔并获取最小值。

       [[NSDate date] timeIntervalSinceDate:referenceDate];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      相关资源
      最近更新 更多