iOS: NSPredicate mit NSDate zu vergleichen
Ich habe eine NSDate
Attribut namens startDate
im persistenten Speicher gespeichert werden im folgenden format (Bild unten).
426174354 = Juli 04, 2014
Muss ich erstellen (3) NSFetchRequest
mit Prädikaten.
Für startDate
:
fetchRequest1
mit Prädikat(s) müssen Sie Holen alles das fällt in der heutigen Datum basierend auf dem Gerät des Benutzers Zeit.fetchRequest2
mit Prädikat(s) müssen Sie Holen alles, was in der Vergangenheit, Bedeutung gestern und vor, basierend auf dem Gerät des Benutzers Zeit.fetchRequest3
mit Prädikat(s) müssen Sie Holen alles, was in die Zukunft, d.h. ab morgen, und nach, basierend auf dem Gerät des Benutzers Zeit.
Unten ist der code, den ich bisher:
-(NSMutableArray *)getFetchPredicate:(NSUInteger)fetchRequestType
{
NSDate *now = [self getcurrentTime:[NSDate date]];
NSDateFormatter *format = [[NSDateFormatter alloc] init];
format.dateFormat = @"dd-MM-yyyy";
format.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
NSString *stringDate = [format stringFromDate:now];
NSDate *todaysDate = [format dateFromString:stringDate];
//today's date is now a date without time.
NSMutableArray *subpredicates;
if (fetchRequestType == 1)
{
NSPredicate *subPredToday = [NSPredicate predicateWithFormat:@"startDate == %@ ", todaysDate];
[subpredicates addObject:subPredToday];
}
else if (fetchRequestType == 2)
{
NSPredicate *subPredPast = [NSPredicate predicateWithFormat:@"startDate < %@", todaysDate];
[subpredicates addObject:subPredPast];
}
else if (fetchRequestType == 3)
{
NSPredicate *subPredFuture = [NSPredicate predicateWithFormat:@"startDate > %@", todaysDate];
[subpredicates addObject:subPredFuture];
}
return subPredicates;
}
-(NSDate *)getcurrentTime:(NSDate*)date
{
NSDate *sourceDate = date;
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSDate* deviceDateWithTime = [[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate];
return deviceDateWithTime;
}
Den code oben ist nicht das abrufen der richtigen Objekte aus CoreData. Ich habe das Gefühl mein Prädikaten zum Vergleich sind falsch. Ich bin mir nicht sicher, wie Sie Sie konvertieren, die gespeicherte Zeit in startDate
nur Datum-format und anzuwenden, die in Prädikaten für den Vergleich. Irgendwelche Vorschläge?
- Keine der fetch-Anfrage-Typen gibt die richtigen Ergebnisse?
- NÖ. Brauche ich zum konvertieren gespeicherte Datum nur Datum nur?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, es ist etwas falsch mit Ihrem Begriff der
todaysDate
. AFAIKNSDate
stellt einen absoluten Punkt in der Zeit, so Ihr bemühen um eine "Date", ohne "Zeit" scheint zwecklos. Und auch die Verwendung vonNSDateFormatter
Sie die Datumsangaben wackelig ist.Ich denke, Sie müssen zwei verschiedene
NSDate
Objekte:startOfCurrentDay
(e.g 00:00:00) undendOfCurrentDay
(e.g 23:59:59) und ich persönlich würde es tun, durch die Verwendung einesNSCalendar
. Wenn Sie dies tun, wird Ihr fetch-Anfrage Prädikate werden:426174354
fürstartDate
dass die gespeicherten Stammdaten, in welchem format ist, dass in? Ich glaube nicht, dass es in Sekunden, oder?