Касание какао: Как я вижу, находятся ли два NSDates в тот же день?

Нет никакого определенного языком значения - это - просто конвенция, которую некоторые люди используют для различения переменных экземпляра от локальных переменных. Другие изменения включают m_foo (и s_foo или g_foo или статические переменные) или mFoo; альтернативно некоторым людям нравится снабжать префиксом локальные переменные (и параметры) вместо переменных экземпляра.

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

67
задан progrmr 26 April 2015 в 00:48
поделиться

4 ответа

NSDateComponents кажется мне лучшим выбором. Еще одна тактика, которую стоит попробовать, - это бесплатное соединение с CFDate, затем использование CFDateGetAbsoluteTime и вычитание, чтобы получить количество времени между двумя датами. Однако вам придется проделать некоторые дополнительные вычисления, чтобы выяснить, совпадают ли даты из-за разницы во времени в один и тот же день.

7
ответ дан 24 November 2019 в 14:23
поделиться

Я использую NSDateComponents, чтобы выделить временной аспект, а затем сравнить. Что-то вроде:

if ([[self beginningOfDay:date1] isEqualToDate:[self beginningOfDay:date2]]) 
{
...
}

- (NSDate *)beginningOfDay:(NSDate *)date {
    NSCalendar *calendar = [NSCalendar currentCalendar];

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents *comp = [calendar components:unitFlags fromDate:date];

    return [calendar dateFromComponents:comp];
}
5
ответ дан 24 November 2019 в 14:23
поделиться

Если вы ориентируетесь на iOS 8 (и OS X 10.9) или более позднюю версию , то Ответ Джо является лучшим решением с использованием нового метода в NSCalendar. только для этой цели:

-[NSCalendar isDate:inSameDayAsDate:]

Для iOS 7 или более ранней версии : NSDateComponents - мое предпочтение. Как насчет чего-то вроде этого:

- (BOOL)isSameDayWithDate1:(NSDate*)date1 date2:(NSDate*)date2 {
    NSCalendar* calendar = [NSCalendar currentCalendar];

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1];
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2];

    return [comp1 day]   == [comp2 day] &&
           [comp1 month] == [comp2 month] &&
           [comp1 year]  == [comp2 year];
}
154
ответ дан 24 November 2019 в 14:23
поделиться

(Note: Look at Joe's answer for a good way to do this on iOS 8+)

I just use a date formatter:

NSDateFormatter *dateComparisonFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];

if( [[dateComparisonFormatter stringFromDate:firstDate] isEqualToString:[dateComparisonFormatter stringFromDate:secondDate]] ) {
    …
}

HTH.

24
ответ дан 24 November 2019 в 14:23
поделиться