objective c - 비교 - 두 개의 다른 NSDate 사이에 NSDate가 발생하는지 확인하는 방법




nsdate nsorderedascending (6)

현재 날짜가 NSDate를 사용하여 날짜 범위 내에 있는지 여부를 파악하려고합니다.

예를 들어 NSDate를 사용하여 현재 날짜 / 시간을 얻을 수 있습니다.

NSDate rightNow = [NSDate date];

그 날짜를 사용하여 오전 9 시부 터 오후 5 시까 지 확인하고 싶습니다.


Quinn과 Brock의 솔루션을 계속 사용하면 NSDate 구현을 서브 클래스화할 수있어서 매우 좋습니다. 그래서 다음과 같이 어디에서나 사용할 수 있습니다 :

-(BOOL) isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([self compare:beginDate] != NSOrderedAscending) && ([self compare:endDate] != NSOrderedDescending));
}

그리고 코드의 어느 부분에서나 다음과 같이 사용할 수 있습니다 :

[myNSDate isBetweenDate:thisNSDate andDate:thatNSDate];

(myNSDate, thisNSDate 및 thatNSDate는 물론 NSDates입니다 :)


Swift의 Brock Woolf 버전 :

extension NSDate
{
    func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool
    {
        if self.compare(beginDate) == .OrderedAscending
        {
            return false
        }

        if self.compare(endDate) == .OrderedDescending
        {
            return false
        }

        return true
    }
}

iOS 10.0 이상 / macOS 10.12 이상을 타겟팅 할 수 있다면 DateInterval 클래스를 사용하십시오.

먼저 시작일과 종료일이있는 날짜 간격을 만듭니다.

let start: Date = Date()
let middle: Date = Date()
let end: Date = Date()

let dateInterval: DateInterval = DateInterval(start: start, end: end)

그런 다음 DateIntervalcontains 메서드를 사용하여 날짜가 간격에 있는지 확인합니다.

let dateIsInInterval: Bool = dateInterval.contains(middle) // true

나는 해결책을 찾았다. 더 나은 해결책을 가지고 있다면 자유롭게 남겨 두십시오. 나는 올바른 것으로 표시 할 것입니다.

+ (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate
{
    if ([date compare:beginDate] == NSOrderedAscending)
        return NO;

    if ([date compare:endDate] == NSOrderedDescending) 
        return NO;

    return YES;
}

이것은 다음과 같이 날짜의 시간 간격을 사용하여 쉽게 수행 할 수 있습니다.

const NSTimeInterval i = [date timeIntervalSinceReferenceDate];
return ([startDate timeIntervalSinceReferenceDate] <= i &&
        [endDate timeIntervalSinceReferenceDate] >= i);

첫 번째 부분에서는 @kperryua 의 대답을 사용하여 비교할 NSDate 객체를 생성합니다. 자신의 질문에 대한 답에서부터 알아 낸 것 같이 들립니다.

실제로 날짜를 비교하기 위해, 나는 당신의 대답에 대한 @Tim 의 의견에 완전히 동의한다. 보다 간결하지만 실제로는 코드와 정확히 동일합니다. 이유를 설명하겠습니다.

+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}

return 문은 && 연산자의 피연산자를 모두 평가해야하는 것처럼 보일 수 있지만 실제로는 그렇지 않습니다. 핵심은 "다양한 프로그래밍 언어로 구현 된" 단락 평가 "입니다. 기본적으로 연산자 &&& 는 첫 번째 인수가 0 (또는 NO, nil 등) 인 경우"단락 "합니다. .), while ||| 첫 번째 인수가 0이 아닌 경우에도 동일한 작업을 수행합니다. datebeginDate 보다 beginDate endDate 와 비교할 필요없이 NO 를 반환합니다. 기본적으로 코드와 동일하지만 한 줄에 한 줄로 된 것이지 5 개 (또는 공백이있는 7 개)가 아닙니다.

이는 프로그래머가 특정 프로그래밍 언어가 논리 표현식을 평가하는 방식을 이해할 때 효율성에 대한 정보없이보다 효과적으로 구성 할 수 있기 때문에 건설적인 입력으로 사용됩니다. 그러나 모든 연산자가 단락되지 않았으므로 효율성이 떨어지는 비슷한 테스트 있습니다. (사실, 수치 비교 연산자와 같은 대부분의 회로는 단락 할 수 없습니다 .) 의문의 여지가있을 때 논리를 깨뜨리는 것이 항상 안전하지만 언어 / 컴파일러가 작은 일을 처리 할 때 코드를 훨씬 쉽게 읽을 수 있습니다 너를 위해서.





nsdate