2016-03-18 17 views
4

yıl önce daha az createdAt tarihleri ​​olanlar bulmak için nesneleri bir NSDate özelliği aracılığıyla Diyar nesneleri filtreleme:Ben Realm filtrelemek çalışıyorum

let datex = NSCalendar.currentCalendar().startOfDayForDate(NSDate()).dateByAddingTimeInterval(-1*365*24*60*60) 

    let list = RealmDB.objects(TaskList).filter("createdAt <= '\(datex)'") 

aşağıdaki hatayı alıyorum:

Expected object of type date for property 'createdAt' on object of type 'TaskList', but received: '2015-03-19 21:00:00 +0000'

Bunu nasıl düzeltirim? Ayrıca tarih ve saat değerinin saat dilimine göre ayarlanmış gibi görünüyor. Tarihin gerçekten günün sonu olduğundan nasıl emin olabilirim?

cevap

4

Anlık sorun, Swift'in string interpolasyonunu, NSPredicate'un argüman yerine kullanılması yerine yüklemenizi oluşturmak için kullanmanızdır.

createdAt <= '2015-03-19 07:00:00 +0000' 

Bu değişmez bir dize ile, createdAt, bir tarih karşılaştırmak çalışıyor: Bu gibi yüklem olmak şeye sonuçlanır. benzeri, gün ışığı tasarrufu nedeniyle süreksizlikler saniye sıçrama ve, tarih hesaplama şekliniz sıçrama gün yüzüne doğru olmadığını

let list = RealmDB.objects(TaskList).filter("createdAt <= %@", datex) 

Not: NSPredicate 'ın argümanı ikame kullanma gibi görünecektir . Sen oldukça sihirli sabitleri ile matematik yapmaktan daha tarih matematik için NSCalendar 'ın yöntemlerini kullanmalıdır: Bir NSDate herhangi bir zaman diliminde bağımsız sürede tek bir noktadan, temsil ettiği

let calendar = NSCalender.currentCalendar() 
let datex = calendar.dateByAddingUnit(.Year, value: -1, toDate: calendar.startOfDayForDate(NSDate()), options: [.MatchFirst]) 

unutmayın. -[NSDate description] çağrıldığında kullanılan NSDate'un varsayılan biçimlendirmesi, tarihi UTC biçiminde biçimlendirir. Tarihi farklı bir saat dilimini kullanarak bir dizeye biçimlendirmek isterseniz, NSDateFormatter öğelerini kullanabilir ve saat dilimini açıkça ayarlayabilirsiniz.

+0

Çok teşekkürler! – alexey