Как сгруппировать NSDate объекты по дням? - PullRequest
3 голосов
/ 06 февраля 2012

Я устанавливаю свойство timeStamp для объекта.Прямо сейчас я просто использую [NSDate date].Пользователь может создавать 10 объектов в день.Но в интерфейсе я хочу отбросить их по дате.Таким образом, каждый день будет показывать все объекты, которые были созданы для этого дня.Как я могу это сделать?Сейчас он пытается сопоставить дату и время и т. Д.

Example: 
Obj1 - 2/5/12 5pm
Obj2 - 2/5/12 12pm
Obj3 - 2/4/12 6pm
Obj4 - 2/1/12 1pm

Мне нужно иметь возможность группировать их по дням, один для 2/5, 2/4 и 2/1.*

Ответы [ 2 ]

3 голосов
/ 06 февраля 2012

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

NSDate *someDate = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit fromDate:someDate];

NSLog(@"Year: %d", [components year]);
NSLog(@"Month: %d", [components month]);
NSLog(@"Day: %d", [components day]);

Вот метод сравнения NSDateComponents:

- (BOOL)isFirstCalendarDate:(NSDateComponents *)first beforeSecondCalendarDate:(NSDateComponents *)second
{
    if ([first year] < [second year]) {
        return YES;
    } else if ([first year] == [second year]) {
        if ([first month] < [second month]) {
            return YES;
        } else if ([first month] == [second month]) {
            if ([first day] < [second day]) {
                return YES;
            }
        }
    }
    return NO;
}

Я не проверял метод сравнения NSDateComponents;было бы полезно от модульного тестирования.

1 голос
/ 06 февраля 2012

Ваш вопрос сформулирован достаточно широко. Чтобы получить часть даты объекта NSDate как NSString, вы можете использовать:

NSDate *dateIn = [NSDate date];

NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
[fmt setDateFormat:@"yyyy-MM-dd"];
NSString *stringOut = [fmt stringFromDate:dateIn];
[fmt release];

Вы можете легко изменить формат даты. Если вы будете часто вызывать этот код (например, в цикле), вы можете выделить и настроить форматер даты только один раз.

...