Запрос диапазона дат области в Objective-C

Я работаю с Realm, и у меня есть массив, отсортированный по датам для всех записей конкретной карты. Мне нужно создать NSPredicate (или каким-то другим способом), который даст мне все даты для этой карты по порядку для определенного месяца. Моя проблема в том, что в некоторых месяцах разное количество дней.

Вот что у меня есть до сих пор.

// Filter specific card, create date and string for x axis
NSString *filteredName = [NSString stringWithFormat:@"%@", self.cardType];
NSDate *dateElement = [[NSDate alloc]init];
NSString *datedString = [[NSString alloc]initWithFormat:@""];

//Formatting datedString
NSDateFormatter *df = [[NSDateFormatter alloc] init];
df.dateFormat = @"MM/dd/YYYY";

NSSortDescriptor *dateSort = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:YES];
NSArray *sortedArray = @[dateSort];

//self.orderHistory is all of the cards from the Realm database filtered down to a specific type of card.
for (Order *uniqueOrder in [self.orderHistory objectsWhere:@"name = [c] %@", filteredName]) {
    // [self.uniqueCardArray addObject:uniqueOrder];
    dateElement = uniqueOrder.date;
    datedString = [df stringFromDate:dateElement];
    [self.uniqueDatesForCardArray addObject:datedString];

}
[self.uniqueCardArray sortUsingDescriptor:sortedArray];

Код выше дает мне все даты для конкретной карты. Мне нужны даты для данного месяца, поэтому я попробовал это безвкусное решение, но я думаю, что есть что-то более элегантное, если не сказать больше.

NSDate *todaysDate = [NSDate date];
NSTimeInterval secondsInMonth =- (60 * 60 * 24 * 365) / 12;
NSDate *dateOneMonthBack = [todaysDate dateByAddingTimeInterval:secondsInMonth];

NSPredicate *backDatesPred = [NSPredicate predicateWithFormat: @"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate];

Помимо того, что это неприятный код, он также вернет меня на месяц назад с текущей даты, а не только на начало месяца. Я просматривал документацию Realm, материал NSCalendar и руководство NSPredicate, и теперь моя голова плавает, пытаясь сосчитать все возможные проблемы, которые могут пойти не так, как надо. Любые советы или фрагменты кода будут очень полезны.


person Robert    schedule 21.11.2015    source источник


Ответы (1)


Я не уверен, правильно ли я понимаю ваш вопрос, вам нужен следующий код?

Чтобы определить дату предыдущего месяца, добавьте к дате NSDateComponet с минусом месяца.

Realm поддерживает BETWEEN запрос. Таким образом, вы можете просто запросить два дня.

NSDate *todaysDate = [NSDate date];

NSDateComponents *comps = [NSDateComponents new];
comps.month = -1;

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *dateOneMonthBack = [calendar dateByAddingComponents:comps toDate:todaysDate options:kNilOptions];

RLMResults *filteredHistory = [self.orderHistory objectsWhere:@"name = [c] %@", filteredName];
RLMResults *rangedHistory = [filteredHistory objectsWhere:@"date BETWEEN {%@, %@}", dateOneMonthBack, todaysDate];
person kishikawa katsumi    schedule 23.11.2015
comment
Это близко к тому, что я ищу, но этот код будет просачиваться в предыдущий месяц, как пример кода (хотя, по общему признанию, уродливый), который я предоставил. То, что я ищу, - это способ вернуться к началу текущего месяца с того места, где сегодняшняя дата. Таким образом, это может быть день назад, три дня назад, 24 дня назад и т. д., чтобы добраться до начала месяца. Извините, что не разъяснил это более четко. Хотя это помогает. - person Robert; 25.11.2015
comment
Итак, ваш вопрос в том, как использовать NSDateComponents, верно? Если вы хотите получить вчера: просто измените comps.month = -1 на comps.day = -1. три дня назад: comps.day = -3, 24 дня назад: comps.day = -24 и т. д. - person kishikawa katsumi; 02.12.2015