2013-03-19 14 views
8

Uso i dati di base per la memorizzazione dei miei oggetti modello di dati. Ogni oggetto ha la proprietà NSDate.NSPredicate filtrato entro l'anno giorno

proprietà NSDate ha formato come qui di seguito:

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

ho bisogno di creare predicato che recupererà i miei oggetti semplicemente questo valore 2013-03-18 senza tempo.

+0

NSString * searchText = @ "2013-03-18"; predicato NSPredicate * [predicato NSPredicateWithFormat: @ "% @", searchText]; NSMutableArray * predarr = [NSMutableArray arrayWithArray: [totalArr filteredArrayUsingPredicate: predicate]]; if (predarr.count> 0) { // Scrivi il tuo lo } –

+0

Gli oggetti 'NSDate' non hanno il formato, se scrivono la loro' descrizione' da qualche parte, il formato dipende dalla configurazione del dispositivo (iOs). –

risposta

11

Se le date sono memorizzate come date effettive, dovresti usarle a tuo vantaggio e non giocare con i formati. Puoi semplicemente creare un predicato che verifica che le date siano tra due date (con tempi). La prima data è la tua data con l'ora 00:00:00 e la seconda data è un giorno dopo.

// 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 per essere più veloce di me e per il * Nota che 1 giorno! = 24 h * commento – vikingosegundo

+0

@vikingosegundo era la tua risposta qui con la stessa logica ma 'oneDay.year = 1'? :) –

+2

@ A-Live, sì, ho modificato il codice che avevo postato qui: http://stackoverflow.com/questions/10954273/how-do-i-do-this-nspredicate-code/10954503#10954503 – vikingosegundo

3

Mentre David ha mostrato come è possibile creare un predicato, voglio aggiungere un modo più semplice per generare una data per 0:00

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

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

startDate ora contiene una data che rappresenta 0:00 per l'ora corrente zona di oggi

NSDate *endDate = [startDate dateByAddingTimeInterval:lengthDay]; 

Ora possiamo metterlo in predicato

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

Grazie a MartinR per il miglioramento.

+0

Il calcolo di 'startOfTomorrow' potrebbe essere leggermente semplificato usando il parametro' interval' in 'rangeOfUnit: ...' e aggiungendolo a 'startOfToday'. Quindi non è necessario alcun componente di data. È corretto? –

+0

@ Martinin, gli intervalli di tempo non sono a conoscenza dell'ora legale e dei secondi bisestili. – vikingosegundo

+0

Cosa intendevo dire: '[[NSCalendar currentCalendar] rangeOfUnit: NSDayCalendarUnit startDate: & startOfToday intervallo: & lengthOfToday forDate: startDate];' 'NSDate * startOfTomorrow = [startOfToday dateByAddingTimeInterval: lengthOfToday];' - Ho effettuato un test rapido con 31.03.2013 (inizio dell'ora legale in Germania, come sai) e 'lengthOfToday' è stato impostato correttamente su 23 ore. –