두 NSD 날짜를 비교하는 방법어느 것이 더 최근입니까?
dropBox 동기화를 시도하고 있으며 두 파일의 날짜를 비교해야 합니다.하나는 제 dropBox 계정에 있고 하나는 제 아이폰에 있습니다.
저는 다음과 같은 것을 생각해 냈지만, 예상치 못한 결과를 얻습니다.두 날짜를 비교했을 때 제가 근본적으로 잘못하고 있는 것 같습니다.저는 단순히 > < 연산자를 사용했지만, 두 개의 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
NSTime을 반환합니다.간격(이중 유형ef), 원시 비교기를 사용할 수 있습니다.
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이 아니어야 합니다.값이 0이면 동작이 정의되지 않으며 이후 버전의 Mac OS X에서 변경될 수 있습니다.
반환 값:
- 수신자와 다른 날짜가 정확히 일치하는 경우,
NSOrderedSame
- 수신자가 다른 날짜보다 늦은 경우,
NSOrderedDescending
- 수신자가 다른 날짜보다 이른 경우,
NSOrderedAscending
.
NSDate compare:, laterDate:, earlyDate: 또는 isEqualToDate: 메서드를 사용하려고 합니다.이 상황에서 < 및 > 연산자를 사용하는 것은 날짜가 아니라 포인터를 비교하는 것입니다.
- (NSDate *)earlierDate:(NSDate *)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
다음을 사용해야 합니다.
- (NSComparisonResult)compare:(NSDate *)anotherDate
날짜를 비교하기 위해.목표 C에는 연산자 오버로드가 없습니다.
이것들을 사용하는 게 어때요?NSDate
방법 비교:
- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
거의 비슷한 상황을 겪었지만, 저의 경우 며칠 차이가 나는지 확인하고 있습니다.
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를 비교해야 할 때 유용합니다.
이 방법으로 두 날짜를 비교할 수도 있습니다.
switch ([currenttimestr compare:endtimestr])
{
case NSOrderedAscending:
// dateOne is earlier in time than dateTwo
break;
case NSOrderedSame:
// The dates are the same
break;
case NSOrderedDescending:
// dateOne is later in time than dateTwo
break;
}
이 단순 함수를 사용하여 날짜 비교
-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{
BOOL isTokonValid;
if ([date1 compare:date2] == NSOrderedDescending) {
NSLog(@"date1 is later than date2");
isTokonValid = YES;
} else if ([date1 compare:date2] == NSOrderedAscending) {
NSLog(@"date1 is earlier than date2");
isTokonValid = NO;
} else {
isTokonValid = NO;
NSLog(@"dates are the same");
}
return isTokonValid;}
저는 그것이 당신에게 효과가 있기를 바랍니다.
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];
언급URL : https://stackoverflow.com/questions/5965044/how-to-compare-two-nsdates-which-is-more-recent
'source' 카테고리의 다른 글
의 형식 문자열에서 가새(곡선 괄호)를 이스케이프하는 방법.그물 (0) | 2023.04.26 |
---|---|
명령 프롬프트에서 Python 명령이 작동하지 않음 (0) | 2023.04.26 |
Android Studio 프로젝트의 .gitignore에는 무엇이 있어야 합니까? (0) | 2023.04.26 |
병렬 목록이 주어지면 다른 목록을 동일한 방식으로 순열(재배치)하면서 하나를 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.26 |
모든 Git 태그를 나열하는 방법? (0) | 2023.04.26 |