2016-10-28 13 views
4

私はこれに問題があったので、適切な答えは見つからなかったので、ここで小さなチュートリアルを残します。今日の日付によるコアデータプレディケートフィルタ

目標は、今日の日付までにフェッチされたオブジェクトをフィルタリングすることです。

注:Swift 3と互換性があります。

+0

Pre-Swift 3の質問と回答:http://stackoverflow.com/questions/35688952/how-fetch-objects-with-nsdate-of-today-using-nspredicate –

答えて

11

あなたは、単に今日の日付にあなたの日付を比較するために使用することはできません。

let today = Date() 
let datePredicate = NSPredicate(format: "date == %@", today) 

それは(それはあまりにも秒に&ミリ秒を含みます)、あなたの日付がEXACT比較日付であるとは考えにくいですので、それはあなたに何も表示されません

解決策はこれです:

// Get the current calendar with local time zone 
var calendar = Calendar.current 
calendar.timeZone = NSTimeZone.local 

// Get today's beginning & end 
let dateFrom = calendar.startOfDay(for: Date()) // eg. 2016-10-10 00:00:00 
let components = calendar.dateComponents([.year, .month, .day, .hour, .minute],from: dateFrom) 
components.day! += 1 
let dateTo = calendar.date(from: components)! // eg. 2016-10-11 00:00:00 
// Note: Times are printed in UTC. Depending on where you live it won't print 00:00:00 but it will work with UTC times which can be converted to local time 

// Set predicate as date being today's date 
let datePredicate = NSPredicate(format: "(%@ <= date) AND (date < %@)", argumentArray: [dateFrom, dateTo]) 
fetchRequest.predicate = datePredicate 

それははるかにのみ示すの最も簡単な&最短の方法です今日の日付を持つオブジェクト。

+5

1日の時間として86400秒を使用しないでください(夏時間の移行を考えてください)。適切なカレンダー方法を使用します。両方の日付を配列として渡すのは間違っています。それを試して、述語を出力してください! –

+1

あなたの最初の例 'NSPredicate(format:" date == Date() ")'は実際に*クラッシュ*します。 –

+0

はい、86400秒は初歩的な実装です。より良い解決策で答えを更新します。そして配列のリマインダーに感謝します。引数配列を渡すことができます。更新された関数では、コードはうまく動作します。 – Lawrence413

関連する問題