2013-03-19 23 views
8

Veri modeli nesnelerini depolamak için Temel Verileri kullanıyorum. Her nesne NSDate özelliğine sahiptir.NSPredicate yıl geçmişine göre filtrelenmiş

2013-03-18 12:50:31 +0000 

Ben zaman olmadan sadece bu değere 2013-03-18 benim nesneleri alıp bunu yüklemi oluşturmak gerekir:

NSDate özellik biçimi aşağıda gibi vardır.

+0

NSString * searchText = @ "2013-03-18"; NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "% @", searchText]; NSMutableArray * predarr = [NSMutableArray dizisiWithArray: [totalArr filtrelenmişDüzenlemeYukarılama: kestir]]; if (predarr.count> 0) // loic kodunuzu yazın } –

+0

'NSDate 'nesneleri format içermez, eğer' description' bir yerde yazılırsa, format aygıt (iOs) yapılandırmasına bağlıdır. –

cevap

11

Tarihleriniz gerçek tarihler olarak depolanıyorsa, bunu avantajınıza göre kullanmalı ve formatlarla çalışmamalısınız. Sadece tarihlerin iki tarih arasında olduğunu (zamanla) kontrol eden bir yüklem oluşturabilirsiniz. İlk tarih saat 00:00:00 ile tarihiniz ve ikinci tarih bir gün sonra.

// Create your date (without the time) 
NSDateComponents *yourDate = [NSDateComponents new]; 
yourDate.calendar = [NSCalendar currentCalendar]; 
yourDate.year = 2013; 
yourDate.month = 3; 
yourDate.day = 18; 
NSDate *startDate = [yourDate date]; 

// Add one day to the previous date. Note that 1 day != 24 h 
NSDateComponents *oneDay = [NSDateComponents new]; 
oneDay.day = 1; 
// one day after begin date 
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay 
                   toDate:startDate 
                   options:0]; 

// Predicate for all dates between startDate and endDate 
NSPredicate *dateThatAreOnThatDay = 
    [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", 
            startDate, 
            endDate]]; 
+3

+1 benden daha hızlı olmak için +1 için ve * Not 1 gün! = 24 h * yorum – vikingosegundo

+0

@vikingosegundo, aynı mantıkla cevabınızdı, ama 'oneDay.year = 1'? :) –

+2

@ A-Live, evet, buraya gönderdiğim kodu düzenledim: http://stackoverflow.com/questions/10954273/how-do-i-do-this-nspredicate-code/10954503#10954503 – vikingosegundo

3

David şimdi şimdiki zaman 0:00 temsil eden bir tarih içeriyor 0:00

NSDate *startDate = [NSDate date]; 
NSTimeInterval lengthDay; 

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit 
           startDate:&startDate 
           interval:&lengthDay 
            forDate:startDate]; 

startDate için bir tarih oluşturmak için bir kolay yolu eklemek istediğiniz, bir yüklemi nasıl oluşturabileceğini gösterdi iken bugün bölge

NSDate *endDate = [startDate dateByAddingTimeInterval:lengthDay]; 

Şimdi yüklem koyabilirsiniz

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

İyileştirme için MartinR'a teşekkürler.

+0

"startOfTomorrow" öğesinin hesaplanması "rangeOfUnit: ..." içindeki "interval" parametresi kullanılarak ve bunu "startOfToday" öğesine ekleyerek biraz basitleştirilebilir. O zaman hiç tarih bileşenine ihtiyacınız yok. Bu doğru mu? –

+0

@MartinR, zaman aralıkları DST ve sıçrama saniye farkında değil. – vikingosegundo

+0

Ne demek istediğim: '[[NSCalendar currentCalendar] rangeOfUnit: NSDayCalendarUnit startDate: & startOfToday aralığı: & lengthOfToday forDate: startDate];' NSDate * startOfTomorrow = [startOfToday dateByAddingTimeInterval: lengthOfToday]; '- 31.03.2013 ile hızlı bir test yaptım (Almanya'da DST'nin başladığını, bildiğiniz gibi) ve 'lengthOfToday' 23 saat doğru olarak ayarlandı. –