我想创建一个时间数组,然后对它们进行排序以找出数组中下一个最接近的时间(如果它经过一段时间,那么它将选择下一个最接近的时间)。我怎样才能做到这一点?我不希望它指定年,月或日。我只想过滤一天中的时间(小时,分钟,秒)。我希望在下一次NSArray
之前得到多少秒。我查看了NSDate
并注意到有timeIntervalSinceDate
方法,但我不知道如何创建NSDate
对象来与之进行比较。
答案 0 :(得分:0)
NSDate * date = [NSDate date];
NSArray * array = @[];
NSUInteger index =
[array indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
return ![[((NSDate *)obj) earlierDate:date] isEqualToDate:date];
}];
NSDate * refDate = nil;
if (index != NSNotFound)
refDate = array[index];
答案 1 :(得分:0)
另一张海报为您提供了使用NSDates的解决方案。 NSDates是指定时间瞬间的对象(包括年,月,日,小时,分钟,秒和小数秒)。
如果您想使用仅反映小时/分钟/秒的时间,我建议您只使用基于秒/天的整数数学:
NSUInteger totalSeconds = hours * 60 * 60 + minutes * 60 seconds;
然后,您可以创建一个包含第二个计数的NSNr值NSArray,并根据需要对其进行操作。
您可以编写一种方法将小时/分钟/秒值转换为NSNumber:
- (NSNumber *) numberWithHour: (NSUInteger) hour
minute: (NSUInteger) minute
second: (NSUInteger) second;
{
return @(hour*60*60 + minute*60 second);
}
然后使用该方法创建一个NSNumbers数组
NSMutableArray *timesArray = [NSMutableArray new];
[timesArray addObject: [self numberWithHour: 7 minute: 30 second: 0]];
[timesArray addObject: [self numberWithHour: 9 minute: 23 second: 17]];
[timesArray addObject: [self numberWithHour: 12 minute: 3 second: 52]];
[timesArray addObject: [self numberWithHour: 23 minute: 53 second: 59]];
};
要获取当前日期的小时/分钟/秒,您将使用NSDate,NSCalendar和NSDateComponents:
NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents comps =
[calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit
fromDate: now];
int hour = [components hour];
int minute = [components minute];
int second = [components second];
unsigned long nowTotalSeconds = hours * 60 * 60 + minutes * 60 seconds;
一旦你计算了今天的总秒数值,你就可以循环遍历你的时间值数组,并使用NSArray方法indexOfObjectPassingTest找到下一个未来的时间
NSUInteger futureTimeIndex = [timesArray indexOfObjectPassingTest:
^BOOL(NSNumber *obj, NSUInteger idx, BOOL *stop)
{
if (obj.unsignedIntegerValue > nowTotalSeconds)
return idx;
}
if (futureTimeIndex != NSNotFound)
NSInteger secondsUntilNextTime =
timesArray[futureTimeIndex].unsignedIntegerValue - nowTotalSeconds;