Как определить, есть ли NSDate сегодня?

Использование фильтра работает для меня в C #.

string s = "searchTerm";
    var filter = Builders<Model>.Filter.Where(p => p.Title.ToLower().Contains(s.ToLower()));
                var listSorted = collection.Find(filter).ToList();
                var list = collection.Find(filter).ToList();

Он может даже использовать индекс, потому что я считаю, что методы вызывается после того, как произойдет возврат, но я еще не тестировал это.

Это также позволяет избежать проблемы

var filter = Builders<Model>.Filter.Eq(p => p.Title.ToLower(), s.ToLower());

, что mongodb будет думать, что p.Title.ToLower () является свойством и не будет правильно отображаться.

148
задан vikingosegundo 14 July 2013 в 17:59
поделиться

4 ответа

Я бы попробовал получить сегодняшнюю дату, нормализованную к полуночи, и вторую дату, нормализованную к полуночи, затем сравнить, одинаковая ли это NSDate.

Из примера Apple вот как вы нормализуете к полуночи сегодняшнюю дату, делаете то же самое для второй даты и сравниваете:

NSCalendar * gregorian = [[NSCalendar alloc]
                               initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents * components =
    [gregorian components:
                 (NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit)
                 fromDate:[NSDate date]];
NSDate * today = [gregorian dateFromComponents:components];
16
ответ дан 23 November 2019 в 22:21
поделиться

Вы можете сравнить компоненты даты:

NSDateComponents *otherDay = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:aDate];
NSDateComponents *today = [[NSCalendar currentCalendar] components:NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:[NSDate date]];
if([today day] == [otherDay day] &&
   [today month] == [otherDay month] &&
   [today year] == [otherDay year] &&
   [today era] == [otherDay era]) {
    //do stuff
}

Изменить:

Мне больше нравится метод Стефана, я думаю, что он делает более понятным и понятным оператор if:

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:[NSDate date]];
NSDate *today = [cal dateFromComponents:components];
components = [cal components:(NSCalendarUnitEra | NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay) fromDate:aDate];
NSDate *otherDate = [cal dateFromComponents:components];

if([today isEqualToDate:otherDate]) {
    //do stuff
}

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


ПРИМЕЧАНИЕ , как и многие ответы на SO, через 7 лет это полностью устарело. В Swift теперь просто используйте .isDateInToday

192
ответ дан 23 November 2019 в 22:21
поделиться

Вы также можете проверить временной интервал между имеющейся у вас датой и текущей датой:

[myDate timeIntervalSinceNow]

Это даст вам временной интервал в секундах между myDate и текущей датой / временем.

Ссылка .

Edit: Примечание для всех: мне хорошо известно, что [myDate timeIntervalSinceNow] не определяет однозначно, является ли myDate сегодняшним днем.

Я оставляю этот ответ как есть, так что если кто-то ищет что-то похожее и [myDate timeIntervalSinceNow] полезно, они могут найти его здесь.

5
ответ дан 23 November 2019 в 22:21
поделиться

Возможно, это можно переделать под категорию NSDate, но я использовал:

// Seconds per day (24h * 60m * 60s)
#define kSecondsPerDay 86400.0f

+ (BOOL) dateIsToday:(NSDate*)dateToCheck
{
    // Split today into components
    NSCalendar* gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    NSDateComponents* comps = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit) 
                                        fromDate:[NSDate date]];

    // Set to this morning 00:00:00
    [comps setHour:0];
    [comps setMinute:0];
    [comps setSecond:0];
    NSDate* theMidnightHour = [gregorian dateFromComponents:comps];
    [gregorian release];

    // Get time difference (in seconds) between date and then
    NSTimeInterval diff = [dateToCheck timeIntervalSinceDate:theMidnightHour];
    return ( diff>=0.0f && diff<kSecondsPerDay );
}

(Однако сравнение двух строк дат, как в исходном вопросе, кажется "чище"...)

0
ответ дан 23 November 2019 в 22:21
поделиться