他の2つのNSDate
と比較する必要があるNSDate
があり、NSOrderAscending
とNSOrderDescending
を試してみますが、他の2つの日付の日付が等しい場合
例:myDate = 24/05/2011
と、1 = 24/05/2011
と2つの24/05/2011
である他の2つがある場合、何を使用できますか?
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ドキュメント を参照してください。
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;
}
時間の差にも変更できます。
楽しい!
日付を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];
比較関数の戻り値が何であるかを尋ねていると思います。
日付が等しい場合、NSOrderedSame
を返します
昇順(2番目の引数> 1番目の引数)の場合、NSOrderedAscending
を返します
降順の場合(2番目の引数<1番目の引数)NSOrderedDescending
を返します
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];
}
NSDate
は、実際には基準日(UTC 2000年1月1日)からの秒単位の時間間隔を表します。内部的には、倍精度浮動小数点数が使用されるため、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つの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;}
日付を変更し、上記の機能をテストするだけです:)