Iphone NSDate查找最接近今天的日期

Iphone NSDate查找最接近今天的日期,iphone,objective-c,ios,xcode,ipad,Iphone,Objective C,Ios,Xcode,Ipad,我有一个已排序的NSDATE数组。有人能帮我找到数组中最接近当前日期的日期吗 我需要获取最近日期的索引,以便在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

我有一个已排序的NSDATE数组。有人能帮我找到数组中最接近当前日期的日期吗

我需要获取最近日期的索引,以便在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];
        }
    }
NSTimeInterval=0;
非整数指数型;
for(NSDate*以m_为单位的日期已排序)
{               
if(绝对值([date-timeintervalncedate:[NSDate-date]])
NSDate
提供了
timeIntervalSinceNow
()方法,该方法返回
NSTimeInterval
(a
typedef
'd
double
)。只需在此基础上使用
fabs()
函数,即可找到每个日期与现在之间的最小差异。

这应该可以:

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;
    }
}
NSDate*closestDate;
用于(NSDate*日期中的临时日期){
NSInteger tempDateInterval=[tempDate timeIntervalSinceNow];
//使用正时差和负时差进行工作
if(tempDateInterval<0){
tempDateInterval*=-1;
}
NSInteger closestDateInterval=[closestDate timeIntervalSinceNow];
if(closestDateInterval<0){
closestDateInterval*=-1;
}
if(tempDateInterval
我相信有很多方法可以给猫剥皮,但我个人最喜欢的剥皮机制是将日期转换为纪元时间,这样你就知道你在比较桔子和桔子,只需将日期作为秒进行比较。这也消除了时区问题

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

使用


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

NSDate*currentDate=[NSDate日期];
double min=[currentDate TimeIntervalenceDate:[array objectAtIndex:0]];
int minIndex=0;
对于(int i=1;i<[数组计数];++i)
{
double currentmin=[currentDate TimeIntervalenceDate:[array objectAtIndex:i]];
如果(当前最小值<最小值){
最小值=当前最小值;
minIndex=i;
}
}

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

根据罗兰·基松的回答,这就是它对我的作用:

 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;
        }
    }
NSDate*currentDate=[[objects objectAtIndex:0]valueForKey:@“date”];
int minIndex=0;
对于(int i=1;i<[对象计数];++i)
{
NSDate*tempDate=[[objects objectAtIndex:i]valueForKey:@“date”];
NSInteger tempDateInterval=[tempDate timeIntervalSinceNow];
如果(tempDateInterval<0)tempDateInterval*=-1;
NSInteger closestDateInterval=[currentDate TimeIntervalsIncessNow];
如果(closestDateInterval<0)closestDateInterval*=-1;
if(tempDateInterval

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

我已经更新了我的帖子,介绍了我正在做的事情,我认为这与你所说的是一致的,但是我做了一些愚蠢的事情,因为它没有按预期工作。你能看看我遗漏了什么吗。@LilMoke你需要将
间隔设置为一个非常大的值,而不是
0
。@LilMoke Sulthan(正确地)编辑了我的答案,将整数改为
双精度
;因此,使用
fabs()
而不是
abs()
。是的,间隔是一个问题。我可以把它调整到一个大数字,现在它可以正常工作了。谢谢。您唯一的问题是
interval
的初始值。当然,由于数组已排序,它的实现可能会更好,但如果您确定初始值,它将起作用。@LilMoke-Sulthan是对的;如果对数组进行排序,则可以使用类似快速排序的实现来提高性能;即从中间开始,上下移动取决于它们的价值。如果您只有一个小的数据集,这可能无关紧要,但是如果您有一个大的数据集,这是值得的。或者您可以将初始间隔设置为
now
和间隔开始增加时的第一个日期和步骤处理之差。@Sulthan--正确。或者,如果数组很大,使用二进制搜索。如果今天晚上11点,哪个日期更接近?明天凌晨1点,还是今天晚上7点?如果您想按日期而忽略时间,则需要查找最接近日期但在日期之前的日期和最接近日期但在日期之后的日期,并检查日期以确定返回哪一天。正在扮演的角色是
[array objectAtIndex:0]
。我们正在从当前日期获取
min
,并使用
timeintervalcescedate
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;
     }
}
 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;
        }
    }