현재 날짜가 NSDate를 사용하여 날짜 범위에 속하는지 여부를 알아 내려고합니다.
예를 들어 NSDate를 사용하여 현재 날짜 / 시간을 가져올 수 있습니다.
NSDate rightNow = [NSDate date];
그런 다음 해당 날짜를 사용하여 오전 9시-오후 5시 범위에 있는지 확인하고 싶습니다 .
답변
해결책을 찾았습니다. 더 나은 솔루션이 있다면 자유롭게 남겨 주시면 올바른 것으로 표시하겠습니다.
+ (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;
}
답변
첫 번째 부분에서는 @kperryua 의 답변을 사용하여 비교할 NSDate 개체를 구성합니다. 당신 자신의 질문에 대한 당신의 대답에서, 당신이 알아 낸 것 같습니다.
실제로 날짜를 비교하기 위해 귀하의 답변에 대한 @Tim 의 의견에 전적으로 동의합니다 . 더 간결하지만 실제로는 코드와 정확히 일치하며 그 이유를 설명하겠습니다.
+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}
return 문이 && 연산자의 두 피연산자를 모두 평가해야하는 것처럼 보일 수 있지만 실제로는 그렇지 않습니다. 핵심은 ” 단락 평가 “로, 다양한 프로그래밍 언어로 구현되며 확실히 C로 구현됩니다. 기본적으로 연산자 &
와 &&
첫 번째 인수가 0 (또는 NO, nil 등) 인 경우 “단락”입니다. , while |
및 ||
첫 번째 인수가 0 이 아닌 경우 동일한 작업을 수행합니다. date
앞에 오면와 비교할 필요없이 beginDate
테스트가 반환 NO
됩니다 endDate
. 기본적으로 코드와 동일한 작업을 수행하지만 5 개 (또는 공백이있는 7 개)가 아닌 한 줄의 단일 명령문으로 수행됩니다.
프로그래머가 자신의 특정 프로그래밍 언어가 논리식을 평가하는 방식을 이해하면 효율성에 대한 관심없이보다 효과적으로 구성 할 수 있기 때문에 이것은 건설적인 입력으로 의도 된 것입니다. 그러나 모든 작업자가 단락되는 것은 아니기 때문에 효율성이 떨어지는 유사한 테스트 가 있습니다. (사실 대부분 은 수치 비교 연산자와 같이 단락 할 수 없습니다 .) 의심스러운 경우 논리를 분리 할 때 항상 명시 적으로 표시하는 것이 안전하지만 언어 / 컴파일러가 작은 일을 처리하도록하면 코드를 훨씬 더 쉽게 읽을 수 있습니다. 당신을 위해.
답변
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
}
}
답변
현재 날짜가 주어진 두 시점 (2009 년 7 월 1 일 오전 9시-오후 5시) 사이에 속하는지 알고 싶다면 NSCalendar 및 NSDateComponents를 사용하여 원하는 시간에 NSDate 인스턴스를 빌드하고 현재 날짜와 비교합니다.
현재 날짜가 매일 이 두 시간 사이에 속하는지 알고 싶다면 다른 길로 갈 수 있습니다. NSCalendar 및 NSDate를 사용하여 NSDateComponents 개체를 만들고 시간 구성 요소를 비교합니다.
답변
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)
그런 다음 다음 contains
방법을 사용하여 날짜가 간격 내에 있는지 확인하십시오 DateInterval
.
let dateIsInInterval: Bool = dateInterval.contains(middle) // true
답변
다음과 같이 날짜의 시간 간격을 사용하여 쉽게 수행 할 수 있습니다.
const NSTimeInterval i = [date timeIntervalSinceReferenceDate];
return ([startDate timeIntervalSinceReferenceDate] <= i &&
[endDate timeIntervalSinceReferenceDate] >= i);
답변
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입니다 🙂