[iphone] 두 NSDate를 비교하는 방법 : 어느 것이 더 최근입니까?
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.
답변
두 날짜를 가정 해 봅시다.
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, 우리는 원시 비교기를 사용할 수 있습니다.
답변
Swift에서는 기존 연산자를 오버로드 할 수 있습니다.
func > (lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.timeIntervalSinceReferenceDate > rhs.timeIntervalSinceReferenceDate
}
func < (lhs: NSDate, rhs: NSDate) -> Bool {
return lhs.timeIntervalSinceReferenceDate < rhs.timeIntervalSinceReferenceDate
}
그런 다음 NSDates <
를 >
, 및 ==
(이미 지원됨) 과 직접 비교할 수 있습니다 .
답변
NSDate
비교 기능이 있습니다.
compare:
NSComparisonResult
수신자의 시간 순서와 지정된 다른 날짜를 나타내는 값을 리턴합니다 .
(NSComparisonResult)compare:(NSDate *)anotherDate
매개 변수 : anotherDate
수신자를 비교할 날짜입니다. 이 값은 0이 아니어야합니다. 값이 nil이면 동작이 정의되지 않으며 이후 버전의 Mac OS X에서 변경 될 수 있습니다.
반환 값 :
- 수신자와 anotherDate가 정확히 동일한 경우
NSOrderedSame
- 수신자가 다른 날짜보다 늦은 시간이면
NSOrderedDescending
- 수신자가 anotherDate보다 시간이 빠르면
NSOrderedAscending
.
답변
NSDate compare :, laterDate :, earlyDate : 또는 isEqualToDate : 메소드를 사용하려고합니다. 이 상황에서 <및> 연산자를 사용하면 날짜가 아닌 포인터를 비교합니다.
답변
- (NSDate *)earlierDate:(NSDate *)anotherDate
이것은 수신자의 이전과 anotherDate를 리턴합니다. 둘 다 동일하면 수신자가 리턴됩니다.
답변
영어로 된 비교를 포함하여 일부 날짜 유틸리티는 다음과 같습니다.
#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