2013-04-05 31 views
12

Seçilen nesnenin seçilen nesnesiyle eşleşen tüm nesneleri getirmeye çalışıyorum selectedDate (bu bir NSDate). Çekirdek Veri kodu gayet iyi, ancak yüklemem 0 sonucunu geri almaya devam ediyor, tarihler kullanıcının seçtiği veritabanında aynı.Çekirdek Verisi Önceden Karşılaştırma Tarih Karşılaştırması

selectedDate, bir yüklemi kullanarak bir varlıktan bir tarihle nasıl karşılaştırılmalıdır?

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

cevap

22

Hazırlamanız iyi görünüyor.

Sıfır sonucu bulmanızın nedeni iade edilir, ancak tarihler tamamen aynı olmayabilir. Örneğin

: Bu iki değer tam olarak aynı olmasa olarak

05/04/2012 13:37:00

05/04/2012 13:37:01 ile uymaz.

Tarihi (gün, ay, yıl) ve saati kontrol etmek ister misiniz?

Sadece tarihi kontrol etmek isterseniz, bir başlangıç ​​tarihi ve bitiş tarihi oluşturmalı ve kullanıcı tarafından seçilen tarihi kullanarak referans çerçevesi olarak karşılaştırmalısınız.

Buna benzer bir şey, 00:00:00 için bir tarih ve saat oluşturmalıdır.

//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 saat, dakika ve saniye ayarlayarak Başka bir tarih oluşturma ve kullanıcı seçilen tarih bu aralıklar arasında düşer olmadığını kontrol edin. genellikle gün eşittir insan iletişim tarihine iken

[NSPredicate predicateWithFormat:@"date BETWEEN %@", [NSArray arrayWithObjects:startOfDay, endOfDay, nil]] 
+7

Çalışıyor, teşekkürler yardımcı olur. Bu yüklemede diziyi kullanarak bir hata alıyorum ama bu çalıştı ..... @ "eDate>% @ AND eDate <% @", date1, date2] Tekrar teşekkürler. – user2228755

+0

neden NSHourCalendarUnit | ekliyorsunuz NSMinuteCalendarUnit | NSSecondCalendarUnit 'bileşenlerinde: fromDate:' sadece atmak için mi? – vikingosegundo

+0

Benim hatam. Bu, bu bileşenleri gerçekten kullanan bir projeden yapıştırdığım koddu. Bu yazının amaçları için onları kaldırmayı ihmal ettim. Şimdi bunu değiştireceğim;] Bunu işaretlediğiniz için teşekkürler! – CaptainRedmuff

11

, bu NSDate nesnelerle aynı değildir: Bir NSDate zaman içinde tek bir anı temsil eder. Sadece saniyeler içinde farklı olan tarihler eşit değildir. Ve aslında günler, aylar, yılları temsil etmiyorlar, bu takvim sisteminden takvim sistemi

'dan farklı olduğundan, aynı dakika, saat, gün… tarihlerinin eşit olup olmadığını kendiniz tanımlamanız gerekir. Temel olarak, programa biraz tuhaflık verecek şekilde öğretmelisiniz. (Dilimlerinin ve Yaz Times farkında) aynı gün tarihleri ​​için dakika çözünürlük

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]; 

için buraya

sadece bu değiştirecek:

[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit 
           startDate:&startDate 
           interval:&length 
            forDate:startDate]; 
+1

Anladım, cevabınız için teşekkür ederim. – user2228755

+1

Benim görüşüme göre, bu kabul edilen cevaptan çok daha iyi çünkü farklı takvimler oluşturuyor ve günün başlangıç ​​ve bitiş zamanlarını kodlamıyor. – SwampThingTom

0

Geçenlerde biraz zaman geçirdim ... Bu aynı sorunu çözmeye teşebbüs ve şimdi yukarıda iOS 8 ve güncellenmiş aşağıdakileri, çözmüş

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]; 

... ve (zaten diğer yanıtlar yukarıda gösterildiği gibi) Çekirdek Veri NSFetchRequest için NSPredicate ...

[NSPredicate predicateWithFormat:@"(dateAttribute >= %@) AND (dateAttribute < %@)", dateDayStart, dateDayNext]] 
2

elimden kabul cevaba bazı değişikliklerle çalışan ve iOS 8 API kullanılarak elde zaman ofseti ile tarihler oluşturun.Kod:

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]; 

onu Umut birisi

+1

Bu benim için çekicilik gibi çalıştı ... upvoted! – NSPratik

İlgili konular