web-dev-qa-db-ja.com

目的Cの2つのNSDateオブジェクトを比較する方法

日付型のオブジェクトがあります。

それらを比較したいので、if条件を次のように書きました。

if (([startDate1 isEqualToDate:[self getDefaultDate]]) || (startDate1 != [ self getDefaultDate] && m_selectedDate >= m_currentDate1 && cycleStopped))
 {

///execute some condition

}

私はこのアプローチで正しいか間違っていますか?

もう一つ。この方法は正しいですか:

if (dtdate > [m_array objectatIndex:i]
{

}

ランダムな振る舞いをしているからです。

31
Ranjit

NSDateメソッド、compare:を使用した例を次に示します

if([startDate compare: endDate] == NSOrderedDescending) // if start is later in time than end
{
    // do something
}

クラス参照から:

もし...

レシーバーとanotherDateは、NSOrderedSameとまったく同じです。

受信者は、anotherDate、NSOrderedDescendingよりも時間的に遅れています。

受信者は、anotherDate、NSOrderedAscendingよりも時間的に早いです。

たとえば、2つの日付を比較して、それらの間の秒を検索する場合は、timeIntervalSinceDate:メソッドを使用することもできます。

編集:

if(([startDate1 compare:[self getDefaultDate]] == NSOrderedSame) || ([startDate1 compare: [self getDefaultDate]] != NSOrderedSame && (([m_selectedDate compare: m_currentDate1] == NSOrderedDescending) || [m_selectedDate compare: m_currentDate1] == NSOrderedSame) && cycleStopped))
74
Luke

NSDatesを比較する簡単な方法(ここにあります http://webd.fr/637-comparer-deux-nsdate ):

#import <Foundation/Foundation.h>

@interface NSDate (Compare)

-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
//- (BOOL)isEqualToDate:(NSDate *)date; already part of the NSDate API

@end

そして実装:

#import "NSDate+Compare.h"

@implementation NSDate (Compare)

-(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);
}

@end

使いやすい:

if([aDateYouWant ToCompare isEarlierThanOrEqualTo:[NSDate date]]) // [NSDate date] is now
{
    // do your thing ...
}

楽しい

19
Pascal

「比較」== NSWhatHaveYouビジネスが複雑すぎて覚えられないことを認めなければなりません(たとえ正しくて機能していても)。 NSDateには、私の脳が扱うのがはるかに簡単な他の2つのメソッド、earlyDateとlaterDateがあります。

このことを考慮:

if ([myDate laterDate:today] == myDate) {
    NSLog(@"myDate is LATER than today");
} else {
    NSLog(@"myDate is EARLIER than today");
}

// likewise:
if ([myDate earlierDate:today] == myDate) {
    NSLog(@"myDate is EARLIER than today");
} else {
    NSLog(@"myDate is LATER than today");
}

どちらのメソッドもNSDateオブジェクトを返します。これは、他のメソッドよりも早いか遅いです。

http://pinkstone.co.uk/how-to-compare-two-nsdates/

4
Jay Versluis

私はルークの答えが本当に好きで、それは魅力のように働きました。

私はこのようなものを使用しました:

If ([enteredDate compare: [NSDate Date]]== NSOrderedSame || NSOrderedDescending)
{
 //Do Something if the enteredDate is later or the same as today
}else
{
//if the enteredDate is before today's date
}

それが役立つかどうかはわかりませんが、ルークが書いたことを繰り返します。

3
Septronic

これは、あなたが考えている日付が早いと考えるよりも大きい(例えば、将来)と思われる日付をチェックする簡単な方法です。これが何をするかです。

  1. 現在および将来の両方の時間間隔(秒およびfrac秒)を取得します
  2. テストの日付が他の日付よりも大きい場合(時間参照)、trueを返します

どうぞ

- (BOOL)isDateGreaterThanDate:(NSDate*)greaterDate and:(NSDate*)lesserDate{

    NSTimeInterval greaterDateInterval = [greaterDate timeIntervalSince1970];
    NSTimeInterval lesserDateInterval = [lesserDate timeIntervalSince1970];

    if (greaterDateInterval > lesserDateInterval) 
        return YES;

    return NO;
}

これも機能します

BOOL *isGreaterDateTruelyGreater = [greaterDate timeIntervalSince1970] > [lesserDate timeIntervalSince1970];

Objective-Cが日付を処理する方法は、直感的ではありません。基本的に、NSTimeIntervalを使用して、ある時点からの秒数を取得できます。たとえば、この1351026414.640865は1970年からの時間間隔です。

特定の時点>特定の時点1351026415.640865> 1351026414.640865上記は1秒先であるため、事実です。

1
Nelson Brian

このリンクは最良の方法でそれを示しています:

http://www.myuiviews.com/2011/01/10/nsdate-comparison-which-is-older.html

0
cREcker