Определение, находится ли NSDate сегодня в NSPredicate - PullRequest
3 голосов
/ 02 июля 2010

Я попробовал несколько методов и попробовал некоторые предложения на этом сайте, но как я могу определить, равен ли атрибут CoreData "dueDate" значению "Сегодня", я знаю, что NSDate также является определенным временем, но я хочу предикат вернуть, если это один и тот же день / месяц / год, независимо от того, какое время в дне. Есть предложения?

Ответы [ 6 ]

3 голосов
/ 14 марта 2013

Вот что я придумал:

- (NSPredicate *)matchAttribute:(NSString *)attributeName withDate:(NSDate *)date
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit fromDate:date];
    NSDateComponents *oneDay = [[NSDateComponents alloc] init];
    oneDay.day = 1;

    NSDate *lastMidnight = [[NSCalendar currentCalendar] dateFromComponents:components];
    NSDate *nextMidnight = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay toDate:lastMidnight options:NSWrapCalendarComponents];

    return [NSPredicate predicateWithFormat:@"(%K >= %@) AND (%K <= %@)", attributeName, lastMidnight, attributeName, nextMidnight];
}

Вдохновение от здесь , здесь и здесь .

2 голосов
/ 03 июля 2010

Исправлено с помощью NSDateComonents и NSCalendar.

Просто создал NSDateComponents всего за день / месяц / год из исходного NSDate, а затем заново создал его до даты с использованием dateFromComponents.

ЭтоТак как это начало дня, я создал другую дату, используя описанный выше метод, который был началом «завтра» и использовал> и <, чтобы увидеть, было ли это «сегодня».В любом случае, спасибо за помощь. </p>

1 голос
/ 04 ноября 2015

Свифт Ответ

Я использую AFDateHelper Если вы не хотите использовать третье лицо.Просто зайдите, проверьте источник, чтобы найти реализацию dateAtStartOfDay() и dateAtEndOfDay()

Тогда это бриз.

NSPredicate(format: "pickup_time > %@ && pickup_time < %@",NSDate().dateAtStartOfDay(),NSDate().dateAtEndOfDay())

1 голос
/ 03 июля 2010

Сегодняшняя концепция хитрая, потому что вы подразумеваете под этим?Вот почему это не так просто.Вы имеете в виду как в тот же день, месяц и год независимо от часового пояса?Вы имеете в виду в течение того же 24-часового периода?В течение последних 24 часов?Это может усложниться.

Ваш ответ на вышеуказанный вопрос определяет ответ на ваш вопрос.Если это один и тот же день, месяц и год, используйте NSDateComponents, чтобы извлечь эти три значения и сравнить их.Если вы имеете в виду в течение 24 часов, то можете использовать метод даты -timeIntervalSinceDate:, чтобы определить количество секунд между датами.

Если вы имеете в виду что-то еще, уточните.

0 голосов
/ 29 февраля 2012

Вы можете найти полезные утилиты Erica Sadun NSDate для такого рода вещей.

Множество действительно удобных кусочков. Проверьте это.

https://github.com/erica/NSDate-Extensions

Мэтт

0 голосов
/ 02 июля 2010

Пара вещей, которые вы можете попробовать.

  1. Добавьте еще один целочисленный атрибут dueDateYYYMMDD к вашей сущности. Преобразуйте NSDate, используя NSDateFormatter, в строку YYYYMMDD, затем используйте NSString integerValue для получения dueDateYYYYMMDD.
  2. Используйте NSDateFormatter для [NSDate date] для создания «today» в формате YYYYMMDD и [NSString integerValue] для получения «today» в виде целого числа (todayInt). Теперь ваш предикат может быть легко создан для сравнения dueDateYYYYMMDD == todayInt.

Сравнение по целочисленным значениям более эффективно, чем строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...