Соответствует заданному дню и месяцу в любом году в 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 статическим объектом.