Соответствует заданному дню и месяцу в любом году в NSDate?

Я хотел бы создать NSDate объект, который может сказать мне, находится ли указанная дата между двумя другими датами, но не учитывать год. У меня есть кое-что в моем приложении, которое делает что-то особенное на Рождество, и я хотел бы сделать это на будущее. Я использую следующий код, чтобы проверить, находится ли текущая дата между 1 декабря и 31 декабря, но мне пришлось указать год (2013).

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

+ (NSDate *)dateForDay:(NSInteger)day month:(NSInteger)month year:(NSInteger)year
{
    NSDateComponents *comps = [NSDateComponents new];
    [comps setDay:day];
    [comps setMonth:month];
    [comps setYear:year];
    return [[NSCalendar currentCalendar] dateFromComponents:comps];
}

- (BOOL)laterThan:(NSDate *)date
{
    if (self == date) {
        return NO;
    } else {
        return [self compare:date] == NSOrderedDescending;
    }
}

- (BOOL)earlierThan:(NSDate *)date
{
    if (self == date) {
        return NO;
    } else {
        return [self compare:date] == NSOrderedAscending;
    }
}

2 ответа

Решение

Похоже, все, что вам нужно сделать, это определить, выпадает ли NSDate в декабре. Я считаю, что вы можете сделать это так:

NSDate * now = [NSDate date];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *nowComponents = [gregorian components:NSMonthCalendarUnit fromDate:now];
if ([nowComponents month] == 12) {
    // It's December, do something
}

Если вы не хотите ограничиваться целым месяцем, вы можете получить месячные и дневные компоненты текущей даты.

Чтобы определить, будет ли дата позже года, чем заданная дата, я бы использовал что-то вроде этого:

// yearlessDate is in the form MMddHHmmss
+BOOL date:(NSDate*)theDate isLaterInYearThan:(NSString*)yearlessDate {
    NSDateFormatter* fmt = [[NSDateFormatter alloc] init];
    fmt.dateFormat = @"MMddHHmmss";
    NSString* theDateFormatted = [fmt stringFromDate:theDate];
    return [theDateFormatted compareTo:yearlessDate] == NSOrderedDescending;
}

Обычные предостережения относятся к часовому поясу, настройке устройства 12/24 и т. Д. Было бы наиболее оптимальным сделать DateFormatter статическим объектом.

Другие вопросы по тегам