Сравнение двух NSDates и игнорирование компонента времени

Все эти ответы и никакой Befunge? Я держал бы пари на изрядное количество, это - самое короткое решение их всех:

1

Не ребячество. Попробуйте его сами: http://www.quirkster.com/iano/js/befunge.html

РЕДАКТИРОВАНИЕ: Я предполагаю, что должен объяснить этого. 1 операнд продвигает 1 на внутренний стек Befunge, и отсутствие чего-либо еще помещает его в цикл по правилам языка.

Используя интерпретатор, если, Вы будете в конечном счете - и я имею в виду в конечном счете - поражает точку, где массив JavaScript, который представляет стек Befunge, становится слишком большим для браузера для перераспределения. Если бы у Вас был простой интерпретатор Befunge с меньшим и ограниченным стеком - как имеет место с большинством языков ниже - то эта программа вызвала бы более значимое переполнение быстрее.

71
задан Magic Bullet Dave 20 September 2010 в 13:56
поделиться

4 ответа

Вы устанавливаете время в дате на 00:00:00 перед выполнением сравнения:

unsigned int flags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSCalendar* calendar = [NSCalendar currentCalendar];

NSDateComponents* components = [calendar components:flags fromDate:date];

NSDate* dateOnly = [calendar dateFromComponents:components];

// ... necessary cleanup

Затем вы можете сравнить значения даты. См. Обзор в справочной документации .

72
ответ дан 24 November 2019 в 12:50
поделиться

В документации относительно NSDate указано, что методы compare: и isEqual: будут выполнять базовое сравнение и упорядочивать результаты, хотя они по-прежнему учитываются во времени.

Вероятно, самым простым способом управления задачей было бы создание нового метода isToday со следующим эффектом:

- (bool)isToday:(NSDate *)otherDate
{
    currentTime = [however current time is retrieved]; // Pardon the bit of pseudo-code

    if (currentTime < [otherDate timeIntervalSinceNow])
    {
        return YES;
    }
    else
    {
        return NO;
    }
}
0
ответ дан 24 November 2019 в 12:50
поделиться

Я удивлен, что ни в одном другом ответе нет этой опции для получения даты «начала дня» для объектов:

[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date1 interval:NULL forDate:date1];
[[NSCalendar currentCalendar] rangeOfUnit:NSCalendarUnitDay startDate:&date2 interval:NULL forDate:date2];

Которая устанавливает date1 и date2 до начала соответствующих дней. Если они равны, это один и тот же день.

Или этот вариант:

NSUInteger day1 = [[NSCalendar currentCalendar] ordinalityOfUnit:NSDayCalendarUnit inUnit: forDate:date1];
NSUInteger day2 = [[NSCalendar currentCalendar] ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitEra forDate:date2];

Устанавливает day1 и day2 в несколько произвольные значения, которые можно сравнивать. Если они равны, они находятся в один день.

83
ответ дан 24 November 2019 в 12:50
поделиться

Я использую этот небольшой метод утилиты:

-(NSDate*)normalizedDateWithDate:(NSDate*)date
{
   NSDateComponents* components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit)
                                              fromDate: date];
   return [calendar_ dateFromComponents:components]; // NB calendar_ must be initialized
}

(Очевидно, вам понадобится ivar с именем calendar_ , содержащий NSCalendar .)

Используя это, легко проверить, является ли дата сегодня такой:

[[self normalizeDate:aDate] isEqualToDate:[self normalizeDate:[NSDate date]]];

( [NSDate date] возвращает текущую дату и время.)

Это, конечно, очень похоже на то, что Грегори предлагает. Недостатком этого подхода является то, что он имеет тенденцию создавать множество временных объектов NSDate . Если вы собираетесь обрабатывать много дат, я бы порекомендовал использовать другой метод, например, прямое сравнение компонентов или работу с объектами NSDateComponents вместо NSDates .

]
6
ответ дан 24 November 2019 в 12:50
поделиться