1

同じ 2 つの NSDates を比較すると、誤った結果が得られます。長すぎるため、この日付を取得する方法を示すことはできませんが、私が何をしているのかを示すことができます:

NSLog(@"this date is:%@ , and date we check to equality is:%@",thisDate,dateToFind);
if([thisDate isEqualToDate:dateToFind]  )
{
    NSLog(@"equal date!"); // not printed! 
}

NSLog は私にこれを示します:

this date is:2012-09-13 14:23:54 +0000 , and date we check to equality is:2012-09-13 14:23:54 +0000

彼は NSLog を印刷しません。なぜ ?

4

2 に答える 2

1

数人が言っているように、問題を引き起こしているのはほんの一瞬のようです。これは、が参照日 (2001 年 1 月 1 日 12AM GMT) からの秒数を持つ( )NSDateの単なるオブジェクト ラッパーであるためです。NSTimeIntervaldouble

これに対処するには、いくつかの主な方法があります。日付をチェックして、指定された範囲内にあるかどうかを確認するか、(おそらく質問に基づいて) 秒の端数を完全に切り捨てます。

から秒を切り捨てるのNSDateは些細なコードです。すばやく比較するために、保存するすべての日付を切り捨てたい場合があります。NSDate次のように既存のものを切り捨てることができます。

NSDate *truncatedDate = [NSDate dateWithTimeIntervalSinceReferenceDate:((NSTimeInterval)lround(originalDateObject.timeIntervalSinceReferenceDate))];

このコードはかなり自明です。日付のバッキング時間間隔を取得し、それを整数キャストに丸め、それを時間間隔に戻し、切り捨てられた新しい日付を作成します。

両方の日付に対してこれを行うと、切り捨てられた 2 つの日付を比較でき、期待どおりに動作します。

または、日付データを変更せずに何かを行う必要がある場合は、次のように簡単に実行できます。

if (lround(thisDate.timeIntervalSinceReferenceDate) == lround(dateToFind.timeIntervalSinceReferenceDate)){
    // If whole seconds are equal, as shown in log, this will execute.
}
于 2012-09-13T15:36:36.963 に答える
0
NSLog(@"this date is:%@ , and date we check to equality is:%@",
      thisDate,dateToFind);

上記を次のように変更してみてください。

NSLog(@"this date is:%f , and date we check to equality is:%f",
      [thisDate timeIntervalSince1970],
      [dateToFind timeIntervalSince1970]);
于 2012-09-13T14:57:58.310 に答える