NSDate查找离今天最近的日期



我有一个NSDates的排序数组。有人能帮助我如何能找到最接近当前日期的数组中的日期?

我需要得到最近日期的索引这样我才能在tableview中滚动到那个日期

例如:2013年1月1日、2013年1月6日、2013年1月9日和2013年1月10日。我想要2013年1月6日的索引。

希望这有意义。谢谢你的帮助。

更新:

我正在尝试这个:

    NSTimeInterval interval = 0;
    NSUInteger indexOfDate;
    for (NSDate * date in m_arEventsSorted)
    {               
        if(abs([date timeIntervalSinceDate:[NSDate date]]) < interval)
        {
            interval = abs([date timeIntervalSinceDate:[NSDate date]]);
            indexOfDate = [m_arEventsSorted indexOfObject:date];
        }
    }

NSDate提供timeIntervalSinceNow(引用)方法,该方法返回一个NSTimeInterval(一个typedef 'd double)。只需使用fabs()函数就可以找到每个日期和now之间的最小差异。

我建议使用timeIntervalSinceDate:函数。类似这样的代码(代码未测试!):

NSDate *currentDate = [NSDate date];
double min = [currentDate timeIntervalSinceDate:[array objectAtIndex:0]];
int minIndex = 0;
for (int i = 1; i < [array count]; ++i)
{
     double currentmin = [currentDate timeIntervalSinceDate:[array objectAtIndex:i]];
     if (currentmin < min) {
           min = currentmin;
           minIndex = i;
     }
}

您可以从minIndex中获得最接近的索引

应该可以:

NSDate *closestDate;
for( NSDate *tempDate in dates ){
    NSInteger tempDateInterval = [tempDate timeIntervalSinceNow];
    //to work with positive and negative time difference
    if( tempDateInterval < 0 ){
        tempDateInterval *= -1;
    }
    NSInteger closestDateInterval = [closestDate timeIntervalSinceNow];
    if( closestDateInterval < 0 ){
        closestDateInterval *= -1;
    }
    if( tempDateInterval < closestDateInterval ){
        closestDate = tempDate;
    }
}

我相信有很多方法可以给猫剥皮,但我个人最喜欢的剥皮机制是将日期转换为epoch时间,这样你就知道你是在比较橙子和橙子,而只是将日期作为秒进行比较。这也消除了时区问题。

如果你需要确保你选择最接近日期的时间,你可能需要用时间的00:00:01和23:59:59来测试日期,并使用最小的结果。

使用

long secondsToDate = [date timeIntervalSince1970];

根据Roland Keesom的回答,这是我的工作方式:

 NSDate *currentDate = [[objects objectAtIndex:0] valueForKey:@"date"];
    int minIndex = 0;
    for (int i = 1; i < [objects count]; ++i)
    {
        NSDate *tempDate = [[objects objectAtIndex:i] valueForKey:@"date"];
        NSInteger tempDateInterval = [tempDate timeIntervalSinceNow];
        if (tempDateInterval < 0) tempDateInterval *= -1;
        NSInteger closestDateInterval = [currentDate timeIntervalSinceNow];
        if (closestDateInterval < 0) closestDateInterval *= -1;
        if( tempDateInterval < closestDateInterval ){
            currentDate = tempDate;
            minIndex = i;
        }
    }

minIndex返回objects数组中离今天最近的日期的索引。

最新更新