如何创建特定时间的数组?

时间:2014-05-06 18:09:22

标签: ios objective-c nsdate

我想创建一个时间数组,然后对它们进行排序以找出数组中下一个最接近的时间(如果它经过一段时间,那么它将选择下一个最接近的时间)。我怎样才能做到这一点?我不希望它指定年,月或日。我只想过滤一天中的时间(小时,分钟,秒)。我希望在下一次NSArray之前得到多少秒。我查看了NSDate并注意到有timeIntervalSinceDate方法,但我不知道如何创建NSDate对象来与之进行比较。

2 个答案:

答案 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;