[ios] NSDate가 오늘인지 확인하는 방법?

확인하는 방법 NSDate오늘 소속 ?

에서의 처음 10자를 사용하여 확인했습니다 [aDate description]. [[aDate description] substringToIndex:10]문자열을 반환 "YYYY-MM-DD"하므로 문자열을에서 반환 한 문자열과 비교했습니다 [[[NSDate date] description] substringToIndex:10].

더 빠르고 깔끔한 확인 방법이 있습니까?

감사.



답변

macOS 10.9 이상 및 iOS 8 이상에는 NSCalendar / Calendar에 정확히이 작업을 수행하는 방법이 있습니다!

- (BOOL)isDateInToday:(NSDate *)date 

그래서 당신은 단순히 할 것입니다

목표 -C :

BOOL today = [[NSCalendar currentCalendar] isDateInToday:date];

스위프트 3 :

let today = Calendar.current.isDateInToday(date)


답변

날짜 구성 요소를 비교할 수 있습니다.

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
   [today month] == [otherDay month] &&
   [today year] == [otherDay year] &&
   [today era] == [otherDay era]) {
    //do stuff
}

편집하다:

나는 스테판의 방법을 더 좋아한다. 나는 그것이 더 깨끗하고 이해하기 쉬운 if 문을 만든다고 생각한다.

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];

if([today isEqualToDate:otherDate]) {
    //do stuff
}

크리스, 난 당신의 제안을 통합했습니다. 나는 시대가 무엇인지 찾아야했기 때문에 모르는 사람은 BC와 AD를 구분합니다. 이것은 아마도 대부분의 사람들에게는 불필요하지만 확인하기 쉽고 확실성을 추가하기 때문에 포함 시켰습니다. 속도가 빠르면 어쨌든 이것은 좋은 방법이 아닙니다.


참고 SO에 많은 답변 등은 7 년 후이 완전히 최신이 아닙니다. 스위프트에서는 이제 사용하십시오..isDateInToday


답변

이것은 귀하의 질문에 대한 파생물이지만 “오늘”또는 “어제”로 NSDate를 인쇄하려면이 함수를 사용하십시오

- (void)setDoesRelativeDateFormatting:(BOOL)b

NSDateFormatter 용


답변

오늘 날짜를 자정과 두 번째 날짜로 표준화하고 자정으로 표준화 한 다음 동일한 NSDate인지 비교하려고합니다.

에서 애플의 예를 여기에 두 번째 날짜와 비교를위한 방법을 정상화 자정 오늘 날짜에 수행 동일합니다 :

NSCalendar * gregorian = [[NSCalendar alloc]
                               initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
    [gregorian components:
                 (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
                 fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];


답변

작업 스위프트 3, 4 연장 Catfish_Man에 의해 제안의 :

extension Date {

    func isToday() -> Bool {
        return Calendar.current.isDateInToday(self)
    }

}


답변

구성 요소, 시대 및 물건으로 저글링 할 필요가 없습니다.

NSCalendar는 기존 날짜의 특정 시간 단위를 시작하는 방법을 제공합니다.

이 코드는 오늘의 시작과 다른 날짜를 가져 와서 비교합니다. 이 NSOrderedSame날짜로 평가 되면 두 날짜 모두 같은 날입니다. 오늘도 마찬가지입니다.

NSDate *today = nil;
NSDate *beginningOfOtherDate = nil;

NSDate *now = [NSDate date];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&today interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&beginningOfOtherDate interval:NULL forDate:beginningOfOtherDate];

if([today compare:beginningOfOtherDate] == NSOrderedSame) {
    //otherDate is a date in the current day
}


답변

extension NSDate {
  func isToday() -> Bool {
    let cal = NSCalendar.currentCalendar()
    var components = cal.components([.Era, .Year, .Month, .Day], fromDate:NSDate())
    let today = cal.dateFromComponents(components)!

    components = cal.components([.Era, .Year, .Month, .Day], fromDate:self)
    let otherDate = cal.dateFromComponents(components)!

    return today.isEqualToDate(otherDate)
}

Swift 2.0에서 나를 위해 일했습니다.