2011-03-27 2 views
2

데이터 유형이 NSTimeInterval 인 것을 알고 있지만 이것은 초 단위입니다. 6 월 21 일 목요일 8:00 - 6 월 21 일 목요일 9:00에 시간 범위를 나타낼 수있는 객체 표현이 필요합니다. 나중에 현재 날짜/시간을 비교하여이 범위 내에 맞는지 확인하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?객관적인 시간 간격을 나타내는 -

답변

3

두 개의 NSDate 개체를 사용하여 시작 날짜와 종료 날짜를 저장하는 것이 좋습니다. 날짜가 그들 사이에 있다면 당신은 쉽게 timeIntervalSinceDate: 방법을 사용하여 확인할 수 있습니다

- (BOOL)dateInInterval:(NSDate *)testDate { 
    // date1 is the instance variable containing the starting date 
    // date2 is the instance variable containing the ending date 
    return ([testDate timeIntervalSinceDate:date1] > 0 && 
      [testDate timeIntervalSinceDate:date2] < 0); 
} 

당신은 단지 첫 번째 전에 있는지 확인하고,이 방법을 포함하여,이있는 NSDate 객체를 보유하는 클래스를 확인해야합니다.

FYI, NSTimeInterval은 클래스가 아니며 double 유형 정의입니다.

편집

당신이, 당신이 당신의 데이터를 저장하고 검색하려면이 비슷한을 사용할 수있는 사전에 대한 키로 이것들을 사용합니다 이후 :

@protocol IntervalDictionaryKey <NSObject> 
// The class you use as keys for your dictionary must implement this method to determine if a object is in the interval 
- (BOOL)intervalContains:(id)object; 
@end 
@interface IntervalDictionary : NSObject { 
    NSMutableArray *keys, *values; 
} 
- (void)addInterval:(id<IntervalDictionaryKey>)interval withObject:(id)object; 
- (void)setObject:(id)object forIntervalOf:(id)intervalObject; 
- (id)objectForIntervalOf:(id)object; 
@end 


@implementation IntervalDictionary 
- (id)init { 
    if(self = [super init]) { 
     keys = [NSMutableArray new]; 
     values = [NSMutableArray new]; 
    } 
    return self; 
} 
- (void)dealloc { 
    [keys release]; 
    [values release]; 
    [super dealloc]; 
} 
- (void)addInterval:(id<IntervalDictionaryKey>)interval withObject:(id)object { 
    [keys addObject:interval]; 
    [values addObject:object]; 
} 
- (void)setObject:(id)object forIntervalOf:(id)intervalObject { 
    id<IntervalDictionaryKey> key; 
    NSUInteger i = 0; 
    for(key in keys) { 
     if([key intervalContains:intervalObject]) { 
      [values replaceObjectAtIndex:i withObject:object]; 
      break; 
     } 
     ++i; 
    } 
} 
- (id)objectForIntervalOf:(id)object { 
    id<IntervalDictionaryKey> key; 
    NSUInteger i = 0; 
    for(key in keys) { 
     if([key intervalContains:object]) { 
      return [values objectAtIndex:i]; 
     } 
     ++i; 
    } 
} 
@end 

사용법 :

예 간격 클래스 :

@interface DateInterval : NSObject <IntervalDictionaryKey> { 
    NSDate *date1, *date2; 
} 
- (BOOL)intervalContains:(NSDate *)date; // this is the same as the dateInInterval method above 
@end 
@implementation DateInterval 
// initializer which sets date1 and date2 
- (BOOL)intervalContains:(NSDate *)date { 
    return ([date timeIntervalSinceDate:date1] > 0 && 
      [date timeIntervalSinceDate:date2] < 0); 
} 
@end 

사용 예제 코드 :

//intervalX is a DateInterval object, created elsewhere 
//objectX is any object, created elsewhere 
//objectInX is a NSDate which is part of intervalX, created elsewhere 
IntervalDictionary *dict = [IntervalDictionary new]; 
[dict addInterval:interval0 withObject:object0]; 
[dict addInterval:interval1 withObject:object1]; 
[dict objectForIntervalOf:objectIn0]; // returns object0 
[dict objectForIntervalOf:objectIn1]; // returns object1 
[dict setObject:object2 forIntervalOf:objectIn1]; // changes the object for interval1 to object2 
[dict objectForIntervalOf:objectIn1]; // now returns object2 
+0

날짜가 항상 같은 날짜 인 경우 답변이 변경 되나요? – aherlambang

+0

그러면 참조 날짜의 오프셋을 저장할 수 있지만 사용시 큰 차이는 없습니다. – ughoavgfhw

+0

문제는 시작 날짜와 종료 날짜가 변경되고 있다는 것입니다. – aherlambang

관련 문제