16

ユーザーのselectedDate(NSDate)に一致するエンティティ内のすべてのオブジェクトをフェッチしようとしています。Core Data コードは問題ありませんが、私の述語は 0 の結果を返し続けます。日付は、ユーザーが選択しているデータベースと同じです。

述語を使用して、selectedDate をエンティティの日付と比較するにはどうすればよいですか?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate = %@)", selectedDate];
4

5 に答える 5

25

あなたの述語は問題ないようです。

ただし、返される結果がゼロである理由は、日付が完全に同じではない可能性があります。

例えば:

05/04/2012 13:37:0005/04/2012 13:37:01これら 2 つの値は完全に同じではないため、 と一致しません。

時刻だけでなく日付(日、月、年)も確認したいですか?

日付のみを確認したい場合は、開始日と終了日を作成し、ユーザーが選択した日付を参照フレームとして使用してそれらを比較する必要があります。

これに似たものは、00:00:00 の日付と時刻を作成する必要があります。

//gather current calendar
NSCalendar *calendar = [NSCalendar currentCalendar];

//gather date components from date
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];

//set date components
[dateComponents setHour:0];
[dateComponents setMinute:0];
[dateComponents setSecond:0];

//return date relative from date
return [calendar dateFromComponents:dateComponents];

時、分、秒を 23:59:59 に設定して別の日付を作成し、ユーザーが選択した日付がこれらの範囲内にあることを確認します。

[NSPredicate predicateWithFormat:@"date BETWEEN %@", [NSArray arrayWithObjects:startOfDay, endOfDay, nil]]
于 2013-04-05T10:56:30.920 に答える
12

人間のコミュニケーションでは、日付はしばしば日と同じですが、NSDate オブジェクトでは同じではありません。NSDate は、時間内の 1 つの瞬間を表します。秒単位で異なる日付は等しくありません。実際には、暦体系ごとに異なるため、日、月、年をまったく表していません。

同じ分、時間、日…の日付が等しいかどうかを自分で定義する必要があります。したがって、基本的には、あいまいさを許容するようにプログラムを教える必要があります。

分解像度についてはこちら

NSDate *startDate = ....;
NSTimeInterval length;

[[NSCalendar currentCalendar] rangeOfUnit:NSMinuteCalendarUnit 
                                startDate:&startDate
                                 interval:&length 
                                  forDate:startDate];

NSDate *endDate = [startDate dateByAddingTimeInterval:length];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(eDate >= %@) AND (eDate < %@)", startDate, endDate];

同じ日の日付の場合 (タイムゾーンと夏時間に注意してください)、これを変更するだけです:

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit 
                                startDate:&startDate
                                 interval:&length 
                                  forDate:startDate];
于 2013-04-05T11:00:54.553 に答える
2

受け入れられた回答にいくつかの変更を加え、iOS 8 API を使用してタイム オフセット付きの日付を作成することができます。コード:

NSCalendar *calendar = [[FFSharedCalendar singleton] getGregorianCalendar];
NSDate *startOfDay = [calendar dateBySettingHour:0 minute:0 second:0 ofDate:[NSDate date] options:0];
NSDate *endOfDay = [calendar dateBySettingHour:23 minute:59 second:59 ofDate:[NSDate date] options:0];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"createdAt > %@ AND createdAt < %@", startOfDay, endOfDay];
NSArray* plans = [Plan MR_findAllWithPredicate:predicate];

それが誰かを助けることを願っています

于 2016-04-25T06:03:11.757 に答える
0

私は最近、この同じ問題を解決するためにしばらく時間を費やし、以下を解決しました。現在、iOS 8 以降に更新されています...

NSDate *dateDay = nil;
NSDate *dateDayStart = nil;
NSDate *dateDayNext = nil;

dateDay = <<USER_INPUT>>;  //for example - selectedDate

dateDayStart = [[NSCalendar currentCalendar] startOfDayForDate:dateDay];

//  dateDayNext EITHER
dateDayNext = [dateDayStart dateByAddingTimeInterval:(24 * 60 * 60)];

//  dateDayNext OR
NSDateComponents *dateComponentDay = nil;
dateComponentDay = [[NSDateComponents alloc] init];
[dateComponentDay setDay:1];
dateDayNext = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponentDay
                                                            toDate:dateDayStart
                                                           options:NSCalendarMatchNextTime];

...そしてNSPredicateコアデータのNSFetchRequest場合(他の回答で既に示したように)...

[NSPredicate predicateWithFormat:@"(dateAttribute >= %@) AND (dateAttribute < %@)", dateDayStart, dateDayNext]]
于 2016-04-05T04:51:36.900 に答える