0

ローカルデータベースには、NSTimeInterval値のリストが保存されています。特定の月に利用可能なすべてのレコードを見つけてフェッチする必要があります。唯一の問題は、特定の月の最終日のレコードを取得できないように見えることです。

ある月が12月なので、12月1日から12月31日まで(午後11時59分まで)のすべてのレコードをフェッチする必要があるとします。

私は次の実装を使用しています:

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"];
NSDate *endDate = [self.dateFormatter dateFromString:@"31-12-2012"];

NSTimeInterval startDateTimeInterval = [startDate timeIntervalSince1970];
NSTimeInterval endDateTimeInterval = [endDate timeIntervalSince1970];

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate <= %f)",startDateTimeInterval,endDateTimeInterval]];

endDateTimeInterval31日(午前9時)にデータベースに保存された値と比較して、double値がかなり少ないことに気づきました。しかし、それは可能ですが、endDateTimeは12月31日午後11時59分までになると予想しています。

この問題に関するご意見をお聞かせください。

4

2 に答える 2

3

作成しているオブジェクトのNSDate時刻は00:00です。したがって、述語検索には、時刻00:01から23:59までの最終日は含まれません。最も簡単な変更は、終了日を翌日(翌月の初日)に設定し、述語を以下ではなく、未満に変更することです。

[self.dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSDate *startDate = [self.dateFormatter dateFromString:@"1-12-2012"]; // start of range, inclusive
NSDate *endDate = [self.dateFormatter dateFromString:@"1-1-2013"]; // end of range, exclusive
...        
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(mdate >= %f) AND (mdate < %f)",startDateTimeInterval,endDateTimeInterval]];
于 2012-12-03T17:32:13.870 に答える
0

ジェイソンの答えは問題を解決しますが、私は混乱を理解したと思います。通常の英語では日付は通常1日を指定しますが、ココアの用語でNSDateは正確な瞬間です。したがって、長さはなく、完全な説明には、単に日/月/年よりも詳細な情報が必要です。オファーの精度を最も近い1秒単位で作成するための標準的な手段のほとんどは、NSDate明らかに「NSTimeInterval」に変換すると、通常はそれよりも優れたものになります。

1日と2日のNSLog同じ時刻の間に1日あり、同じ時刻の同じ時刻の間に0日あるのと同じように、月の1日と31日の同じ時刻の間に30日があるため、は30を印刷しています。 1日と1日。

したがって、ジェイソンの答えは、「今月の初日の開始後、翌月の初日の開始前」の時間テストを適用するため、正しいです。違いを生むのは「開始」ビットです。

于 2012-12-03T17:46:53.040 に答える