iphone - 두 NSDates를 비교하는 방법:최근에 어떤 것이 있습니까?




swift time class (9)

dropBox 동기화를 달성하려고하고 두 파일의 날짜를 비교해야합니다. 하나는 내 dropBox 계정에 있고 다른 하나는 내 iPhone에 있습니다.

다음과 같은 것을 생각해 냈지만 예상치 못한 결과가 나옵니다. 나는 두 날짜를 비교할 때 근본적으로 잘못된 것을하고 있다고 생각합니다. 나는 단순히 <연산자를 사용했지만 두 NSDate 문자열을 비교할 때 이것이 좋지 않다고 생각한다. 여기 우리가 간다 :

NSLog(@"dB...lastModified: %@", dbObject.lastModifiedDate); 
NSLog(@"iP...lastModified: %@", [self getDateOfLocalFile:@"NoteBook.txt"]);

if ([dbObject lastModifiedDate] < [self getDateOfLocalFile:@"NoteBook.txt"]) {
    NSLog(@"...db is more up-to-date. Download in progress...");
    [self DBdownload:@"NoteBook.txt"];
    NSLog(@"Download complete.");
} else {
    NSLog(@"...iP is more up-to-date. Upload in progress...");
    [self DBupload:@"NoteBook.txt"];
    NSLog(@"Upload complete.");
}

이것은 다음과 같은 (임의의 & 잘못된) 출력을 주었다 :

2011-05-11 14:20:54.413 NotePage[6918:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:54.414 NotePage[6918:207] iP...lastModified: 2011-05-11 13:20:48 +0000
2011-05-11 14:20:54.415 NotePage[6918:207] ...db is more up-to-date.

또는이 올바른 일이 발생했습니다 :

2011-05-11 14:20:25.097 NotePage[6903:207] dB...lastModified: 2011-05-11 13:18:25 +0000
2011-05-11 14:20:25.098 NotePage[6903:207] iP...lastModified: 2011-05-11 13:19:45 +0000
2011-05-11 14:20:25.099 NotePage[6903:207] ...iP is more up-to-date.

ENGLISH의 비교를 포함하여 일부 날짜 유틸리티는 훌륭합니다.

#import <Foundation/Foundation.h>


@interface NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
- (NSDate*) dateByAddingDays:(int)days;

@end

구현 :

#import "NSDate+Util.h"


@implementation NSDate (Util)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedAscending);
}

-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
    return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedDescending);

}
-(BOOL) isEarlierThan:(NSDate*)date {
    return ([self compare:date] == NSOrderedAscending);
}

- (NSDate *) dateByAddingDays:(int)days {
    NSDate *retVal;
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:days];

    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    retVal = [gregorian dateByAddingComponents:components toDate:self options:0];
    return retVal;
}

@end

NSDate compare :, laterDate :, earlierDate :, 또는 isEqualToDate : 메서드를 사용하려고합니다. 이 상황에서 <와> 연산자를 사용하는 것은 포인터가 아닌 날짜를 비교하는 것입니다.


나는 거의 동일한 상황에 직면 해 있지만, 제 경우에는 일수 차이가 있는지 확인하고 있습니다.

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *compDate = [cal components:NSDayCalendarUnit fromDate:fDate toDate:tDate options:0];
int numbersOfDaysDiff = [compDate day]+1; // do what ever comparison logic with this int.

일 / 월 / 년 단위로 NSDate를 비교해야 할 때 유용합니다.


나는 그것이 당신을 위해 일하기를 바랐습니다.

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];      
int unitFlags =NSDayCalendarUnit;      
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];     
NSDate *myDate; //= [[NSDate alloc] init];     
[dateFormatter setDateFormat:@"dd-MM-yyyy"];   
myDate = [dateFormatter dateFromString:self.strPrevioisDate];     
NSDateComponents *comps = [gregorian components:unitFlags fromDate:myDate toDate:[NSDate date] options:0];   
NSInteger day=[comps day];

다음을 사용해야합니다.

- (NSComparisonResult)compare:(NSDate *)anotherDate

날짜 비교. 객관적인 C에는 연산자 과부하가 없습니다.


두 날짜를 가정 해 봅시다.

NSDate *date1;
NSDate *date2;

그런 다음 다음 비교를 통해 어느 것이 더 빠르거나 나중 / 같은지 알 수 있습니다.

if ([date1 compare:date2] == NSOrderedDescending) {
    NSLog(@"date1 is later than date2");
} else if ([date1 compare:date2] == NSOrderedAscending) {
    NSLog(@"date1 is earlier than date2");
} else {
    NSLog(@"dates are the same");
}

자세한 내용은 NSDate 클래스 문서 를 참조하십시오.


파티가 끝나기 전에 NSDate 객체를 비교하는 또 다른 쉬운 방법은 '>'< ''== '등을 쉽게 사용할 수있는 원시 유형으로 변환하는 것입니다.

예.

if ([dateA timeIntervalSinceReferenceDate] > [dateB timeIntervalSinceReferenceDate]) {
    //do stuff
}

timeIntervalSinceReferenceDate 는 날짜를 초로 변환합니다 (2001 년 1 월 1 일, GMT). timeIntervalSinceReferenceDate 는 NSTimeInterval (double typedef)을 반환하므로 기본 비교자를 사용할 수 있습니다.


NSDate 에는 비교 함수가 있습니다.

compare: 수신기의 시간 순서와 다른 날짜를 나타내는 NSComparisonResult 값을 반환합니다.

(NSComparisonResult)compare:(NSDate *)anotherDate

파라미터 : anotherDate 리시버를 비교하는 일자. 이 값은 nil이 아니어야합니다. 값이 nil이면 비헤이비어가 정의되지 않으며 이후 버전의 Mac OS X에서 변경 될 수 있습니다.

반환 값 :

  • 리시버와 anotherDate가 정확히 같으면 NSOrderedSame
  • 리시버가 anotherDate보다 늦은 시간에 도착하면 NSOrderedDescending
  • 수신기의 시간이 anotherDate보다 빠르면 NSOrderedAscending 입니다.

- (NSDate *)earlierDate:(NSDate *)anotherDate

이것은 receiver와 anotherDate의 초기 값을 반환합니다. 둘 다 같으면 수신자가 리턴됩니다.







nsdate