2

日付を取得して新しいポインターを作成し、それを同じ値の別の日付と比較します。これは同じ日付であると報告されますが、一致しないと主張しています。

NSDate *date2 = [[NSDate alloc] initWithTimeIntervalSince1970:[date1 timeIntervalSince1970]];
NSLog(@"date 2: %@", date2);
NSLog(@"date 3: %@", date3);
NSLog(@"equal: %i", [date2 isEqualToDate:date3]);

これは NSLog です。

date 2: 2013-03-15 11:12:24 +0000
date 3: 2013-03-15 11:12:24 +0000
equal: 0

これらが同等に返されない理由は何ですか?

4

4 に答える 4

2

これを試して..

NSComparisonResult result = [date1 compare:date2]; // comparing two dates
switch (result) {
  case NSOrderedAscending:
    InfoLog(@"date1 is less");
    break;
  case NSOrderedDescending:
    InfoLog(@"date1 is greater");
    break;
  case NSOrderedSame:
    InfoLog(@"same date");
    break;
  default:
    break;
}
于 2013-03-15T11:29:16.107 に答える
1

これで確認してください:

NSCalendar *calendar         = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date2];
NSDate *date2New             = [calendar dateFromComponents:components];
components                   = [calendar components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:date3];
NSDate *date3New             = [calendar dateFromComponents:components];

if([date2New isEqualToDate:date3New])
{
   //do stuffs
}

あなたのコードの問題は、 isEqualToDate: がまったく同じ日付をチェックすることだと思います(1秒未満の違いも条件が失敗する原因になります)

NSDateによると:

isEqualToDate:

指定されたオブジェクトが NSDate オブジェクトであり、レシーバーと正確に等しいかどうかを示すブール値を返します。 - (BOOL)isEqualToDate:(NSDate *)anotherDate

パラメーター

別の日付

The date to compare with the receiver.

戻り値

anotherDate が NSDate オブジェクトであり、レシーバーと正確に等しい場合は YES、そうでない場合は NO。

討論

このメソッドは、日付間の 1 秒未満の差を検出します。より細かい精度で日付を比較したい場合は、timeIntervalSinceDate: を使用して 2 つの日付を比較します

于 2013-03-15T11:31:51.173 に答える
0

マイクロ秒とも比較されるため、0 のような値が返さ れますtimeIntervalSinceDate:。このメソッドは、マイクロ秒、秒などの範囲内にある日付に使用されます。

于 2013-03-15T11:38:07.870 に答える