Как я могу генерировать удобные диапазоны даты на основе данного NSDate?

, Что точно первый класс программирует конструкцию?

Простой ответ: это - что-то, что поддерживает все стандартные операции, которые обеспечивает язык. На объектно-ориентированном языке конструкции первого класса, как Вы могли бы ожидать, объекты. Оказывается, что на таких языках часто существует, для эффективности или причин прежней версии, граждан второго класса, обычно примитивные типы данных, которые не являются надлежащими объектами, и для которого Вы не можете сделать определенных вещей с.

, Например, в Java Точка является абсолютным объектом. Можно объявить

List<Point> plist;

и затем поместить точки в него. Интервал не является абсолютным объектом. Существуют определенные вещи, которые Вы не можете сделать с интервалом - разделяют на подклассы от него, например, или вызывают методы на него кроме некоторых предопределенных операторов. И при этом Вы не можете сохранить его в

List<int> intlist;

, Java имеет для этой проблемы, в которой существует "помещенный в коробку" тип, Целое число, которое является абсолютным объектом. Можно объявить List<Integer>, например. Однако использование Целого числа намного менее эффективно, чем с "интервалом". Java обеспечивает автоматическую упаковку и распаковывание (то есть преобразование) Целого типа к интервалу и назад снова в контекстах, где один или другой требуется, чтобы помочь программисту объединить лучший из обоих миров.

Наличие двух типов - Целое число и интервал - для целого числа сбивают с толку, и что-то вроде взлома. Ранняя версия Java, мне говорят, не имела никаких примитивов, и все его типы были законченными объектами. Это оказалось слишком медленным для его надлежащего использования (ранний Java оказался медленным так или иначе, конечно!), таким образом, некоторые примитивы, которые не поддерживали надлежащую объектную семантику, были добавлены.

в.NET 1,1 делегата не смогли быть переданными в методы, потому что они не были конструкциями программирования первого класса (я считал что-то вдоль этих строк).

я ничего не знаю о.NET, но кажется, что у Вас есть идея. Вы правы - если делегаты не могут быть переданы в методы как никакой другой стандартный объект, они не конструкции программирования первого класса.

5
задан Community 23 May 2017 в 12:10
поделиться

2 ответа

Ну, поскольку timeInterval выражается в секундах, просто вычислите, сколько секунд в дне:

60 секунд * 60 минут * 24 часа = 1 день.

Затем в методе rangeForDayContainDate вы можете извлечь компоненты даты, получить текущий день, создать новую дату на основе дня с часами и минутами, установленными на 0:00, и создать конец дата, добавляющая временной интервал, как вычислено выше.

2
ответ дан 13 December 2019 в 22:12
поделиться

Для полноты картины, вот мое окончательное решение (с благодарностью Кендаллу Хельмстеттеру Гельну и Джбреннану):

+ (NSCalendar *)calendar
{
    NSCalendar * gregorian = [[NSCalendar alloc]
                              initWithCalendarIdentifier:NSGregorianCalendar];
    return [gregorian autorelease];
}

////////////////////////////////////////////////////////////////

+ (NSDateComponents *)singleComponentOfUnit:(NSCalendarUnit)unit
{
    NSDateComponents * component = [[NSDateComponents alloc] init];

    switch (unit)
    {
        case NSDayCalendarUnit: [component setDay:1]; break;
        case NSWeekCalendarUnit: [component setWeek:1]; break;
        case NSMonthCalendarUnit: [component setMonth:1]; break;
        case NSYearCalendarUnit: [component setYear:1]; break;
    }

    return [component autorelease];
}

////////////////////////////////////////////////////////////////

+ (WM_DateRange *)rangeForUnit:(NSCalendarUnit)unit
               surroundingDate:(NSDate *)date
{
    WM_DateRange * range = [[self alloc] init];

    // start of the period
    NSDate * firstDay;
    [[self calendar] rangeOfUnit:unit
                       startDate:&firstDay
                        interval:0
                         forDate:date];
    [range setStartDate:firstDay];

    // end of the period
    [range setEndDate:[[self calendar]
        dateByAddingComponents:[self singleComponentOfUnit:unit]
                        toDate:firstDay
                       options:0]];

    return [range autorelease];
}

////////////////////////////////////////////////////////////////

+ (WM_DateRange *)rangeForDayContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSDayCalendarUnit surroundingDate:date]; }

+ (WM_DateRange *)rangeForWeekContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSWeekCalendarUnit surroundingDate:date]; }

+ (WM_DateRange *)rangeForMonthContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSMonthCalendarUnit surroundingDate:date]; }

+ (WM_DateRange *)rangeForYearContainingDate:(NSDate *)date
{ return [self rangeForUnit:NSYearCalendarUnit surroundingDate:date]; }

////////////////////////////////////////////////////////////////

- (void)dealloc
{
    [endDate release];
    [startDate release];
    [super dealloc];
}
8
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: