iOS:2つの日付を比較する


96

私が持っているNSDate、私は他の2つと比較しなければならないことをNSDate、私はしてみてくださいNSOrderAscendingNSOrderDescending私の日付は、他の2つの日付に等しい場合は?

例:myDate = 24/05/2011 1つと2つであると他の2つがある場合24/05/201124/05/2011何を使用できますか?


1
私はあなたの質問を完全に理解していません、あなたは何を達成しようとしていますか?
アークライト

日付1および日付2は、1 = 15/05/2011および2 = 31/05/2011にすることができますが、それらは同じ日1 = 24/05/2011および2 = 24/05/2011である必要があります。 myDataは、日付1と日付2の間にあります
cyclingIsBetter

年、月、日付を抽出して、その順序で比較するだけです。同点の場合は、次のフィールドを比較します。
Himadri Choudhury、

回答:


210

AppleのドキュメントによるとNSDate compare:

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

- (NSComparisonResult)compare:(NSDate *)anotherDate

パラメーター anotherDate

レシーバーと比較する日付。この値はnilであってはなりません。値がnilの場合、動作は定義されておらず、Mac OS Xの将来のバージョンで変更される可能性があります。

戻り値

次の場合:

レシーバーとanotherDateは完全に同じですが、 NSOrderedSame

レシーバーがanotherDateより遅れている NSOrderedDescending

レシーバーは、anotherDateよりも早い時間に、 NSOrderedAscending

言い換えると:

if ([date1 compare:date2] == NSOrderedSame) ...

あなたの特定のケースではこれを読み書きする方が簡単かもしれません:

if ([date2 isEqualToDate:date2]) ...

これについてはAppleのドキュメントを参照してください。


しかし、f([date1 compare:date2] == NSOrderedSame)は、時間と分と秒もチェックし、私はそれを望まない
cyclingIsBetter

1
あなたの質問は少し不明瞭で申し訳ありませんでした。stackoverflow.com/questions/ 1889164/3092009#3092009を見てください。これに対する答えが見つかります。
Vincent Guerci、

この答えは両方の点で正しいです。あなたが使用することを比較している日付コンポーネントを制御するにはNSDateComponents
Nazir

32

StackoverflowとWebをたくさん検索した後、私はそれを行う最良の方法は次のようであると結論づけなければなりません:

- (BOOL)isEndDateIsSmallerThanCurrent:(NSDate *)checkEndDate
{
    NSDate* enddate = checkEndDate;
    NSDate* currentdate = [NSDate date];
    NSTimeInterval distanceBetweenDates = [enddate timeIntervalSinceDate:currentdate];
    double secondsInMinute = 60;
    NSInteger secondsBetweenDates = distanceBetweenDates / secondsInMinute;

    if (secondsBetweenDates == 0)
        return YES;
    else if (secondsBetweenDates < 0)
        return YES;
    else
        return NO;
}

時間差にも変更できます。

楽しい!


編集1

日付をdd / MM / yyyyの形式のみで比較する場合は、NSDate* currentdate = [NSDate date];&&の間に以下の行を追加する必要がありますNSTimeInterval distance

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"dd/MM/yyyy"];
[dateFormatter setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]
                          autorelease]];

NSString *stringDate = [dateFormatter stringFromDate:[NSDate date]];

currentdate = [dateFormatter dateFromString:stringDate];

1
これは、compareまたはisEqualToDateよりもうまく機能します。ありがとう
ArdenDev

同意した。compare&isEqualToDateの使用に問題が見つかりました。確かに、それは余分な2行のコードかもしれませんが、より信頼性があります。
Roebuckコーチ、2015

23

私はあなたが比較関数の戻り値が何であるかを尋ねていると思います。

日付が等しい場合は返されます NSOrderedSame

昇順の場合(2番目の引数> 1番目の引数)を返す NSOrderedAscending

降順(2番目の引数<1番目の引数)の場合 NSOrderedDescending


昇順と降順を考える良い方法です。
デビッド

16

これを尋ねたかどうかは正確にはわかりませんが、NSDateの日付コンポーネントのみを比較したい場合は、NSCalendarおよびNSDateComponentsを使用して時間コンポーネントを削除する必要があります。

このようなものがNSDateのカテゴリとして機能するはずです。

- (NSComparisonResult)compareDateOnly:(NSDate *)otherDate {
    NSUInteger dateFlags = NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit;
    NSCalendar *gregorianCalendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
    NSDateComponents *selfComponents = [gregorianCalendar components:dateFlags fromDate:self];
    NSDate *selfDateOnly = [gregorianCalendar dateFromComponents:selfComponents];

    NSDateComponents *otherCompents = [gregorianCalendar components:dateFlags fromDate:otherDate];
    NSDate *otherDateOnly = [gregorianCalendar dateFromComponents:otherCompents];
    return [selfDateOnly compare:otherDateOnly];
}

2

NSDate実際には、基準日(2000年1月1日UTCだと思います)からの時間間隔を秒単位で表します。内部的には、倍精度浮動小数点数が使用されるため、任意の2つの日付が同じ日付であっても、それらが等しいと比較されることはほとんどありません。特定の日付が特定の日に該当するかどうかを確認する場合は、おそらくを使用する必要がありますNSDateComponents。例えば

NSDateComponents* dateComponents = [[NSDateComponents alloc] init];
[dateComponents setYear: 2011];
[dateComponents setMonth: 5];
[dateComponents setDay: 24];
/*
 *  Construct two dates that bracket the day you are checking.  
 *  Use the user's current calendar.  I think this takes care of things like daylight saving time.
 */
NSCalendar* calendar = [NSCalendar currentCalendar];
NSDate* startOfDate = [calendar dateFromComponents: dateComponents];
NSDateComponents* oneDay = [[NSDateComponents alloc] init];
[oneDay setDay: 1];
NSDate* endOfDate = [calendar dateByAddingComponents: oneDay toDate: startOfDate options: 0];
/*
 *  Compare the date with the start of the day and the end of the day.
 */
NSComparisonResult startCompare = [startOfDate compare: myDate];
NSComparisonResult endCompare = [endOfDate compare: myDate];

if (startCompare != NSOrderedDescending && endCompare == NSOrderedDescending)
{
    // we are on the right date
} 

2

次の関数で日付の比較を確認して、最初に2つのNSDateオブジェクトを作成し、関数に渡します。viewDidloadで、またはシナリオに従って、次のコード行を追加します。

-(void)testDateComaparFunc{

NSString *getTokon_Time1 = @"2016-05-31 03:19:05 +0000";
NSString *getTokon_Time2 = @"2016-05-31 03:18:05 +0000";
NSDateFormatter *dateFormatter=[NSDateFormatter new];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss Z"];
NSDate *tokonExpireDate1=[dateFormatter dateFromString:getTokon_Time1];
NSDate *tokonExpireDate2=[dateFormatter dateFromString:getTokon_Time2];
BOOL isTokonValid = [self dateComparision:tokonExpireDate1 andDate2:tokonExpireDate2];}

ここに機能があります

-(BOOL)dateComparision:(NSDate*)date1 andDate2:(NSDate*)date2{

BOOL isTokonValid;

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

}

return isTokonValid;}

日付を変更し、上記の機能をテストするだけです:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.