2011-08-27 2 views
2

이것은 정말 간단해야합니다!시간 데이터 객체를 저장하고 비교하는 방법

나는 가게가 있는데, 8시 30 분에 열리고 17시에 닫힙니다. 내 앱에서 현재 상점이 열렸거나 현재 폐쇄 된 상태라고 말하고 싶습니다.

내 open_time 및 close_time을 저장하는 가장 좋은 방법은 무엇입니까? 하루가 시작된 이래로 초 단위로 저장합니다 (예 : 30600 및 63000).

이것은 의미가 있지만 오늘의 시작부터 초 단위로 현재 시간을 어떻게 얻을 수 있습니까? 따라서 current_time이 open_time과 close_time 사이에 있는지, 즉 열려 있는지 확인할 수 있습니다.

미리 감사드립니다.

답변

2

이 문제는 생각만큼 평범하지 않습니다. 날짜를 매우 신중하게 다뤄야합니다. 가장 좋은 해결책은 열려있는 시간과 닫은 시간을 모두 날짜로 저장하는 것입니다.

NSDate * now = [NSDate date]; 
NSCalendar * calendar = [NSCalendar currentCalendar]; 
NSDateComponents * comps = [calendar components:~(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now]; 
[comps setHour:8]; 
[comps setMinute:30]; 
NSDate * open = [calendar dateFromComponents:comps]; 
[comps setHour:17]; 
[comps setMinute:0]; 
NSDate * close = [calendar dateFromComponents:comps]; 

if ([now compare:open] == NSOrderedDescending && [now compare:close] == NSOrderedAscending) { 
    // The date is within the shop's hours. 
} 
else { 
    // The date is not within the shop's hours. 
} 

가 여기에 내가했던 일이야 : :

  1. 잡아 현재 날짜 여기 열기/닫기 시간을 만들고 그것들을 비교하기위한 몇 가지 코드입니다.

  2. 시간, 분 및 초를 제외한 날짜의 구성 요소를 가져옵니다.

  3. 시간과 분을 설정하십시오.

  4. 열린 시간을 만드십시오.

  5. 가까운 시간 동안 3-4 단계를 반복하십시오.

  6. 지금까지 열려 있던 시간과 닫은 시간을 비교해보십시오.

혹시 날짜의 변경을해야하는 경우

, 당신이해야 항상 사용 NSCalendarNSDateComponents. 왜 그렇게 중요한지 this answer을 확인하십시오.

+0

애플이이 간단한 문제를 그렇게 어렵게 만드는 것은 다소 우스꽝 스럽다. – zaph

+1

나는 반대로 주장 할 것이다. Apple은 어려운 문제를 간단하게 만듭니다. 내 대답에 링크 된 답변을 확인하십시오. 날짜는 매우 복잡합니다. 특히 어떤 종류의 현지화 작업을 원할 경우 특히 그렇습니다. 위의 코드를 자체 메서드로 래핑하여 코드가 너무 추해 보이지 않게하는 것도 쉽습니다. – rbrown

+1

NSOrderedAscending과 NSOrderedDescending을 뒤집어서는 안됩니까? 실제로 열려있는 시간 내에 있지 않지만 그 반대의 경우에는 코드가 긍정적으로 나타납니다. –

0

다음과 같이 할 수 있습니다.

NSDate *today = // code for getting today date at 0 oclock 
NSDate *now = [NSDate date]; 
double second = [now timeIntervalSinceDate:today]; 

이제 시작일부터 두 번째로 비교할 시간이 있습니다.

+1

두 번 포인터가 아니라 이중 포인터 여야합니다. –

1

명확한 해결책은 시간당/분 구성 요소가있는 NSDate 개체를 사용하는 것입니다.

기본적으로 어딘가에 응용 프로그램에서 당신은 같은 가게의 열기/닫기 시간을 저장해야합니다

NSCalendar *calendar = [[NSCalendar alloc] 
         initWithCalendarIdentifier: NSGregorianCalendar]; 
NSDateComponents *openTime = [[NSDateComponents alloc] init]; 
[openTime setHour: 12]; 
[openTime setMinute: 30]; 
NSDate *openDate = [calendar dateFromComponents: openTime]; 
[calendar release]; 

을 그리고 당신은 현재 시간이 당신이있을 수 오브젝트이 같은있는 NSDate 사이에 있는지 여부를 확인해야하는 경우 방법 :

- (BOOL)currentTimeIsInBetween: (NSDate *)date1 andDate: (NSDate *)date2 { 
    NSCalendar *calendar = [[NSCalendar alloc] 
          initWithCalendarIdentifier: NSGregorianCalendar]; 
    NSDateComponents *currentComponents = [calendar components: 
            (NSMinuteCalendarUnit | NSHourCalendarUnit) 
              fromDate: [NSDate date]]; 
    NSDate *currentAdjusted = [calendar dateFromComponents: currentComponents]; 
    [calendar release]; 

    if ([currentAdjusted compare: date1] == NSOrderedAscending) 
     return NO; 

    if ([currentAdjusted compare: date2] == NSOrderedDescending) 
     return NO; 

    return YES; 
} 

편집 : 사용자가 나를 좋아하는 것 같아요.