Надежная проверка того, попадает ли NSDate в заданный час, день или неделю

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

Будет ли это выдерживать пользовательские 12 и 24-часовое время? руководство по форматированию дат указывает, что этот пользовательский параметр может привести к некоторому непредвиденному поведению даты: «В iOS пользователь может переопределить настройку по умолчанию AM / PM по сравнению с 24-часовым временем. Это может привести к тому, что NSDateFormatter перепишет указанную строку формата».

Как насчет базовой схемы кода для этой проблемы? Является ли этот код надежным образом служить своей цели? Мне не нравится публиковать вопрос «проверить мой код», но для меня это довольно незнакомая проблема, достаточно сложная, чтобы строго проверить, что это кажется оправданным. NSDateFormatter также является относительно новым для меня; другая мотивация для вопроса.

ПРИМЕЧАНИЕ. Основным источником моей нервозности является то, что преобразование дат в строки и последующее сравнение строк кажутся неотъемлемо хрупким методом решения этой проблемы. Но это лучшее, что я мог придумать.

Быстрая ссылка: dateFormat s, который я использовал для каждого из трех случаев:

 dateFormat = @"yyyyMMddHH"; // For "this hour" check dateFormat = @"yyyyMMdd"; // For "today" check dateFormat = @"yyyyww"; // For "this week" check 

Благодаря! Код:

 - (BOOL)didThisCycle { // Case 1: hourly; Case 2: daily; Case 3: weekly BOOL did = NO; NSDate *now = [NSDate date]; NSDate *lastDid = [self.didDates lastObject]; if (![lastDid isKindOfClass:[NSDate class]]) { // Crash protection return NO; } int type = [self.goalType intValue]; switch (type) { case 1: { // If hourly check hour NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; formatter.dateFormat = @"yyyyMMddHH"; NSString *nowString = [formatter stringFromDate:now]; NSString *lastDidString = [formatter stringFromDate:lastDid]; if ([nowString isEqualToString:lastDidString]) { did = YES; } else { did = NO; } break; } case 2: { // If daily check day NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; formatter.dateFormat = @"yyyyMMdd"; NSString *nowString = [formatter stringFromDate:now]; NSString *lastDidString = [formatter stringFromDate:lastDid]; if ([nowString isEqualToString:lastDidString]) { did = YES; } else { did = NO; } break; } case 3: { // If weekly check week NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; formatter.dateFormat = @"yyyyww"; NSString *nowString = [formatter stringFromDate:now]; NSString *lastDidString = [formatter stringFromDate:lastDid]; if ([nowString isEqualToString:lastDidString]) { did = YES; } else { did = NO; } break; } default: { did = NO; break; } } return did; } 

Используйте класс NSDateComponents, например:

 NSDate *someDate = // whatever NSDate *now = [NSDate date]; NSDateComponents *thenComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:someDate]; NSDateComponents *nowComponents = [[NSCalendar currentCalendar] components:NSHourCalendarUnit|NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit fromDate:now]; if([thenComponents year] == [nowComponents year] && [thenComponents month] == [nowComponents month] && [thenComponents day] == [nowComponents day] && [thenComponents hour] == [nowComponents hour]) { // hooray } 

Удалите компонент «час», если вы просто хотите проверить день, или удалить как это, так и «день» (и заменить NSWeekCalendarUnit и метод NSWeekCalendarUnit ), чтобы проверить неделю.

Interesting Posts

Анимация изображений в мобильном приложении HTML5 (PhoneGap), например, приложение Google Plus для iPhone при прокрутке вниз?

Попытки использовать UIButton в UITableViewCell с использованием автоматизации пользовательского интерфейса завершаются неудачей с «не могут быть задействованы»,

Как полностью удалить Xcode и очистить все настройки

iCloud UIDocumentPicker прерывается с перерывами и зависает

iPhone / iOS: как мне сообщить, какую локализацию использует телефон во время выполнения?

Метод обновления SkScene прерывается push-уведомлениями, как я могу обнаружить прерывание

Лучшая практика: что делать, когда контроллер просмотра загружается очень долго?

Не удалось добавить идентификатор приложения, поскольку предел идентификатора приложения «10» в «7» дней превышен

Pull-to-refresh изменяет значение массива?

Проблема с разделителем UITableView

Как включить или отключить биткод для конкретной библиотеки или SDK в проекте Xcode

@ вставка шрифтов в iOS 3.0 – 4.1

Эквивалент MPMovieScalingMode в AVPlayer?

Получите обложку альбома из песни, играющей через Apple Music

вертикальный UIScrollView внутри горизонтальный UIPageViewController не прокрутка

Давайте будем гением компьютера.