web-dev-qa-db-ja.com

2つのNSDateを比較する方法:どちらが最近のものですか?

私はdropBox同期を達成しようとしていると2つのファイルの日付を比較する必要があります。 1つは私のdropBoxアカウントにあり、もう1つは私のiPhoneにあります。

私は以下のことを思いついたが、私は予想外の結果を得た。 2つの日付を比較すると、根本的に間違ったことをしていると思います。単純に> <演算子を使用しましたが、2つの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.
237
n.evermind

2つの日付を仮定しましょう。

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クラスのドキュメント を参照してください。

646
Nick Weaver

パーティーに遅れますが、NSDateオブジェクトを比較するもう1つの簡単な方法は、それらをプリミティブ型に変換することです。これにより、 '>' '<' '=='などを簡単に使用できます。

例えば。

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

timeIntervalSinceReferenceDateは、日付を参照日(2001年1月1日、GMT)からの秒数に変換します。 timeIntervalSinceReferenceDateはNSTimeInterval(double typedef)を返すので、プリミティブコンパレータを使用できます。

47
So Over It

Swiftでは、既存の演算子をオーバーロードすることができます。

func > (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate > rhs.timeIntervalSinceReferenceDate
}

func < (lhs: NSDate, rhs: NSDate) -> Bool {
    return lhs.timeIntervalSinceReferenceDate < rhs.timeIntervalSinceReferenceDate
}

その後、NSDatesを<>、および==と直接比較できます(既にサポートされています)。

14
Andrew

NSDateには比較関数があります。

compare:受信側と指定された別の日付の時間的順序を示すNSComparisonResult値を返します。

(NSComparisonResult)compare:(NSDate *)anotherDate

パラメーターanotherDate受信者を比較する日付。この値はnilであってはいけません。値がnilの場合、動作は未定義であり、Mac OS Xの将来のバージョンでは変わる可能性があります。

戻り値:

  • 受信者とanotherDateが完全に等しい場合、NSOrderedSame
  • 受信側がanotherDateよりも時間的に遅れている場合は、NSOrderedDescending
  • 受信側がanotherDateより早い場合はNSOrderedAscending
13
Gary

NSDate compare:、laterDate:、earlyDate :、またはisEqualToDate:メソッドを使用します。この状況で<および>演算子を使用すると、日付ではなくポインタが比較されます。

12
Dan F
- (NSDate *)earlierDate:(NSDate *)anotherDate

これは受信者とanotherDateの早い方を返します。両方が同じであれば、受信側が返されます。

11
user745098

ニースであるIN 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
7
Dan Rosenstark

あなたが使用する必要があります:

- (NSComparisonResult)compare:(NSDate *)anotherDate

日付を比較するObjective Cでは、演算子のオーバーロードはありません。

6
Joris Mans

なぜNSDateのcompareメソッドを使わないのですか?

- (NSDate *)earlierDate:(NSDate *)anotherDate;
- (NSDate *)laterDate:(NSDate *)anotherDate;
6
justicepenny

私はほぼ同じ状況に遭遇したことがありますが、私の場合は日数の違いがないか確認しています

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を日/月/年単位で比較する必要がある場合に便利です。

4
Andy

この方法でも2つの日付を比較できます

        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;

        }
1
kapil

私はそれがあなたのために働くことを願っています

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];
0
Concept Infoway

この単純な関数を日付比較に使用してください

-(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;}
0
Akhtar