iphone - 한국 - objective c nsorderedascending




두 개의 NSDate 비교 및 시간 구성 요소 무시 (11)

Duncan C 접근 방식을 사용하여 실수를 수정했습니다.

-(NSInteger) daysBetweenDate:(NSDate *)firstDate andDate:(NSDate *)secondDate { 

    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [currentCalendar components: NSDayCalendarUnit fromDate: firstDate toDate: secondDate options: 0];

    NSInteger days = [components day];

    return days;
}

두 NSDate를 비교하는 가장 효율적 / 권장 방법은 무엇입니까? 두 날짜가 같은 시간에 상관없이 시간에 관계없이 볼 수 있기를 원한다면 NSDate 클래스에서 timeIntervalSinceDate : 메서드를 사용하는 코드를 작성하고이 값을 초 수로 나눈 값을 얻습니다. 하루 만에. 이것은 오래 동안 바람을 피 웠고 나는 분명히 뭔가 빠져있는 것처럼 느낍니다.

내가 고치려고하는 코드는 다음과 같습니다.

if (!([key compare:todaysDate] == NSOrderedDescending))
{
    todaysDateSection = [eventSectionsArray count] - 1;
}

여기서 key와 todaysDate는 NSDate 객체이고 todaysDate는 다음을 사용하여 만듭니다.

NSDate *todaysDate = [[NSDate alloc] init];

문안 인사

데이브


Swift 3에서 코딩하는 개발자

if(NSCalendar.current.isDate(selectedDate, inSameDayAs: NSDate() as Date)){
     // Do something
}

iOS 8.0 이상에서는 다음을 사용할 수 있습니다.

NSCalendar *calendar = [NSCalendar currentCalendar];
NSComparisonResult dateComparison = [calendar compareDate:[NSDate date] toDate:otherNSDate toUnitGranularity:NSCalendarUnitDay];

결과가 NSOrderedDescending 인 경우 otherDate는 [NSDate date] 이전 일입니다.

NSCalendar 설명서에이 방법이 표시되지 않지만 iOS 7.1에서 iOS 8.0 API 차이점에 있습니다.


iOS 8을 사용하여 NSCalendar에 도입 된 새로운 방법이있어 훨씬 쉽게 사용할 수 있습니다.

- (NSComparisonResult)compareDate:(NSDate *)date1 toDate:(NSDate *)date2 toUnitGranularity:(NSCalendarUnit)unit NS_AVAILABLE(10_9, 8_0);

중요한 단위에 세밀도를 설정합니다. 이것은 다른 모든 유닛을 무시하고 선택한 유닛과의 비교를 제한합니다.


나는이 객체에 대해 "시작일"날짜를 얻는 다른 옵션이 없다는 것에 놀랐습니다.

[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date1 interval:NULL forDate:date1];
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date2 interval:NULL forDate:date2];

date1date2 를 각각의 요일의 시작으로 설정합니다. 동등한 경우 같은 날에 있습니다.

또는이 옵션 :

NSUInteger day1 = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit: forDate:date1];
NSUInteger day2 = [[NSCalendar currentCalendar] ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date2];

day1day2 를 비교할 수있는 다소 임의의 값으로 설정합니다. 동등한 경우 같은 날에 있습니다.


나는이 작은 util 메서드를 사용한다 :

-(NSDate*)normalizedDateWithDate:(NSDate*)date
{
   NSDateComponents* components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
                                              fromDate: date];
   return [calendar_ dateFromComponents:components]; // NB calendar_ must be initialized
}

(분명히 NSCalendar 포함 된 calendar_ 라는 ivar가 있어야합니다.)

이것을 사용하면 오늘 날짜가 다음과 같은지 쉽게 확인할 수 있습니다.

[[self normalizeDate:aDate] isEqualToDate:[self normalizeDate:[NSDate date]]];

( [NSDate date] 는 현재 날짜와 시간을 반환합니다.)

이것은 물론 Gregory가 제안한 것과 매우 유사합니다. 이 접근법의 단점은 많은 임시 NSDate 객체를 만드는 경향이 있다는 것입니다. 많은 날짜를 처리하려면 구성 요소를 직접 비교하거나 NSDates 대신 NSDateComponents 객체로 작업하는 등의 다른 방법을 사용하는 것이 좋습니다.


대답은 모두가하는 것보다 간단합니다. NSCalendar에는 메소드가 있습니다.

components:fromDate:toDate:options

이 방법을 사용하면 원하는 단위를 사용하여 두 날짜 간의 차이를 계산할 수 있습니다.

그래서 다음과 같은 메소드를 작성하십시오.

-(NSInteger) daysBetweenDate: (NSDate *firstDate) andDate: (NSDate *secondDate)
{
  NSCalendar *currentCalendar = [NSCalendar currentCalendar];
  NSDateComponents components* = [currentCalendar components: NSDayCalendarUnit
    fromDate: firstDate 
    toDate: secondDate
    options: 0];

  NSInteger days = [components days];
  return days;
}

위의 메소드가 0을 반환하면 두 날짜가 같은 날에 있습니다.


비교를 수행하기 전에 날짜의 시간을 00:00:00으로 설정합니다.

unsigned int flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSCalendar* calendar = [NSCalendar currentCalendar];

NSDateComponents* components = [calendar components:flags fromDate:date];

NSDate* dateOnly = [calendar dateFromComponents:components];

// ... necessary cleanup

그런 다음 날짜 값을 비교할 수 있습니다. 참조 문서개요를 참조 하십시오.


이것은 피부에 특히 못생긴 고양이이지만, 여기에 또 다른 방법이 있습니다. 우아하다고는 말할 수 없지만, iOS에서 날짜 / 시간 지원을받을 수있을만큼 가깝습니다.

bool isToday = [[NSDateFormatter localizedStringFromDate:date dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterNoStyle] isEqualToString:[NSDateFormatter localizedStringFromDate:[NSDate date] dateStyle:NSDateFormatterFullStyle timeStyle:NSDateFormatterNoStyle]];

NSDate 관련 문서에 따르면 compare:isEqual: 메서드는 기본 비교를 수행하고 결과를 순서화합니다 (시간의 요소 임에도 불구하고).

아마도 작업을 관리하는 가장 간단한 방법은 다음과 같은 효과를 위해 새로운 isToday 메서드를 만드는 것입니다.

- (bool)isToday:(NSDate *)otherDate
{
    currentTime = [however current time is retrieved]; // Pardon the bit of pseudo-code

    if (currentTime < [otherDate timeIntervalSinceNow])
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

int interval = (int)[firstTime timeIntervalSinceDate:secondTime]/(60*60*24);
if (interval!=0){
   //not the same day;
}




nsdate