Все эти ответы и никакой Befunge? Я держал бы пари на изрядное количество, это - самое короткое решение их всех:
1
Не ребячество. Попробуйте его сами: http://www.quirkster.com/iano/js/befunge.html
РЕДАКТИРОВАНИЕ: Я предполагаю, что должен объяснить этого. 1 операнд продвигает 1 на внутренний стек Befunge, и отсутствие чего-либо еще помещает его в цикл по правилам языка.
Используя интерпретатор, если, Вы будете в конечном счете - и я имею в виду в конечном счете - поражает точку, где массив JavaScript, который представляет стек Befunge, становится слишком большим для браузера для перераспределения. Если бы у Вас был простой интерпретатор Befunge с меньшим и ограниченным стеком - как имеет место с большинством языков ниже - то эта программа вызвала бы более значимое переполнение быстрее.
Вы устанавливаете время в дате на 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
Затем вы можете сравнить значения даты. См. Обзор в справочной документации .
В документации относительно 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;
}
}
Я удивлен, что ни в одном другом ответе нет этой опции для получения даты «начала дня» для объектов:
[[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
в несколько произвольные значения, которые можно сравнивать. Если они равны, они находятся в один день.
Я использую этот небольшой метод утилиты:
-(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
.