Как хранить и сравнивать объекты данных времени - PullRequest
2 голосов
/ 27 августа 2011

Это должно быть действительно просто!

У меня есть магазин, он открывается в 8:30 и закрывается в 17:00. Я хочу, чтобы мое приложение сообщило, что магазины в настоящий момент открыты или закрыты.

Как лучше всего хранить мои open_time и close_time? Сохраняйте их как секунды с начала дня, то есть 30600 и 63000?

Это имеет смысл, но как мне получить текущее время прямо сейчас, в секундах с начала сегодняшнего дня, чтобы я мог проверить, находится ли current_time между open_time и close_time, то есть open !!

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 27 августа 2011

Эта проблема не так тривиальна, как вы думаете. Вы должны работать с датами очень тщательно. Лучшее решение - хранить все ваши открытые и закрытые времена как даты. Вот некоторый код для создания вашего времени открытия / закрытия и сравнения их:

NSDate * now = [NSDate date];
NSCalendar * calendar = [NSCalendar currentCalendar];
NSDateComponents * comps = [calendar components:~(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:now];
[comps setHour:8];
[comps setMinute:30];
NSDate * open = [calendar dateFromComponents:comps];
[comps setHour:17];
[comps setMinute:0];
NSDate * close = [calendar dateFromComponents:comps];

if ([now compare:open] == NSOrderedDescending && [now compare:close] == NSOrderedAscending) {
    // The date is within the shop's hours.
}
else {
    // The date is not within the shop's hours.
}

Вот что я сделал:

  1. Получить текущую дату.

  2. Получить компоненты даты, кроме часов, минут и секунд.

  3. Установите часы и минуты.

  4. Создать время открытия.

  5. Повторите шаги 3-4 для закрытия.

  6. Сравните время открытия и закрытия с текущим временем.

Если вам когда-либо понадобится изменить дату, вы должны всегда использовать NSCalendar и NSDateComponents. Посмотрите этот ответ , почему это так важно.

1 голос
/ 27 августа 2011

Я думаю, что более ясным решением было бы использование объектов NSDate с присутствием только часовых / минутных компонентов.

По сути, где-то в вашем приложении вам нужно хранить время открытия / закрытия магазина как таковое:

NSCalendar *calendar = [[NSCalendar alloc] 
                         initWithCalendarIdentifier: NSGregorianCalendar];
NSDateComponents *openTime = [[NSDateComponents alloc] init];
[openTime setHour: 12];
[openTime setMinute: 30];
NSDate *openDate = [calendar dateFromComponents: openTime];
[calendar release];

И если вам нужно посмотреть, находится ли текущее время между двумя такими объектами NSDate, у вас может быть такой метод:

- (BOOL)currentTimeIsInBetween: (NSDate *)date1 andDate: (NSDate *)date2 {
    NSCalendar *calendar = [[NSCalendar alloc] 
                             initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents *currentComponents = [calendar components: 
                                   (NSMinuteCalendarUnit | NSHourCalendarUnit)
                                          fromDate: [NSDate date]];
    NSDate *currentAdjusted = [calendar dateFromComponents: currentComponents];
    [calendar release];

    if ([currentAdjusted compare: date1] == NSOrderedAscending)
        return NO;

    if ([currentAdjusted compare: date2] == NSOrderedDescending)
        return NO;

    return YES;
}

РЕДАКТИРОВАТЬ: похоже, пользователь rbrown был немного быстрее, чем я, мы предлагаем тот же подход.

0 голосов
/ 27 августа 2011

Вы можете сделать что-то вроде этого.

NSDate *today = // code for getting today date at 0 oclock
NSDate *now = [NSDate date];
double second = [now timeIntervalSinceDate:today];

Теперь у вас есть время в секундах с начала дня для сравнения.

...