我有一个排序的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];
}
}
答案 0 :(得分:7)
NSDate
提供了timeIntervalSinceNow
(reference)方法,该方法返回NSTimeInterval
(typedef
'd double
)。只需使用此fabs()
功能即可找到每个日期与现在之间的最小差异。
答案 1 :(得分:2)
我建议使用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获得最接近的索引。
答案 2 :(得分:1)
这应该有效:
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;
}
}
答案 3 :(得分:0)
我敢肯定有很多方法可以给猫皮肤,但我个人最喜欢的皮肤机制是将日期转换为纪元时间,这样你就知道你正在将橙子与橙子进行比较,只需将日期作为秒数进行比较。这也消除了时区问题。
如果您需要确保选择最接近日期的时间,您可能需要在时间00:00:01和23:59:59测试日期,并使用最小的结果。
使用
long secondsToDate = [date timeIntervalSince1970];
答案 4 :(得分:0)
基于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
数组中最接近今天的索引。