2

iOS で 2 つの日付の差分を計算する方法に関するいくつかのスレッドを読みました。これは、Apple ドキュメントでも提供されていると思われる例です。これを使用して、2 つの日付が同じかどうかを判断します (時間は無視します)。ただし、コンポーネント: メソッドは、2 つの日付が異なっていても、常に年 = 0、月 = 0、日 = 0 を返します。理由がわかりません...ご意見いただければ幸いです...

+ (BOOL)isSameDate:(NSDate*)d1 as:(NSDate*)d2 {
if (d1 == d2) return true;
if (d1 == nil || d2 == nil) return false;

NSCalendar* currCal = [NSCalendar currentCalendar];

// messing with the timezone - can also be removed, no effect whatsoever:
NSTimeZone* tz = [NSTimeZone timeZoneForSecondsFromGMT:0];
[currCal setTimeZone:tz];

NSDateComponents* diffDateComps =
[currCal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
        fromDate:d1 toDate:d2 options:0];

return ([diffDateComps year] == 0 && [diffDateComps month] == 0 && [diffDateComps day] == 0);
}
4

1 に答える 1

1

問題が見つかりました。すべての日付で発生したわけではなく、連続した日付でのみ発生しました。component:fromDate:toDate が 12 月 23 日 8:00、12 月 24 日 07:59 の場合、時間コンポーネントがコンポーネント フラグにない場合でも 0 を返すため、「isSameDate」が正しく実装されていないことが判明しました。ただし、12 月 23 日 8:00、12 月 24 日 8:01 の場合は 1 を返します。

メソッドを修正するには、別のことを実行する必要がありました。

NSDateComponents* c1 =
    [currCal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
        fromDate:d1];

NSDateComponents* c2 =
    [currCal components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
        fromDate:d2];

return ([c1 day] == [c2 day] && [c1 month] == [c2 month] && [c1 year] == [c2 year]);
于 2012-12-25T07:12:21.283 に答える