Squeak.ru - шаблоны программирования

Как узнать, находится ли NSDate в указанном диапазоне?

Итак, мне трудно (без каламбура) найти, находится ли NSDate в определенном диапазоне. Учтите это: посещение по расписанию с 17:00 до 18:00. Я хочу узнать, находится ли запланированное посещение в пределах +/- 15 минут от текущего времени. Таким образом, мой безопасный диапазон составляет от 16:45 до 18:15. Как я могу узнать, входит ли запланированное посещение в диапазон или выходит за его пределы? Вот код, который у меня есть до сих пор, который вообще не работает...

- (BOOL)isInScheduledRange {
//    NSLog(@"Start: %f", [self.start timeIntervalSinceNow]);
//    NSLog(@"End: %f", [self.end timeIntervalSinceNow]);
//    
//    if (([self.start timeIntervalSinceNow] >= -900) && ([self.end timeIntervalSinceNow] <= 3600)) {
//        NSLog(@"In Range");
//        
//        return YES;
//    }
//    
    NSDate *now = [[NSDate alloc] init];

//    if ((([self.start timeIntervalSinceDate:now] >= -900) && ([self.start timeIntervalSinceDate:now] <= 900)) && (([self.end timeIntervalSinceDate:now] <= -900) && ([self.end timeIntervalSinceDate:now] >= 900))) {
//        NSLog(@"In Range");
//    }

    NSLog(@"%@; %@; %@", now, self.start, self.end);
//    NSLog(@"%@; %@", [self.start timeIntervalSinceDate:now], [self.end timeIntervalSinceDate:now]);

    if ((([self.start timeIntervalSinceDate:now] >= -900) && ([self.start timeIntervalSinceDate:now] <= 0)) && (([self.end timeIntervalSinceDate:now] >= 0) && ([self.end timeIntervalSinceDate:now] <= 900))) {
        NSLog(@"In Range");
    }

    return NO;

    [now release];
}

Буду признателен за помощь. У меня возникли трудности с этим расчетом времени.

Отдельно хочу отметить, что я ненавижу иметь дело со временем, независимо от того, с какой платформой я работаю...

07.04.2011

Ответы:


1

Вы хотите проверить, меньше ли время начала после текущего времени на 900 секунд, а время окончания меньше чем на 900 секунд до текущего времени. timeIntervalSinceDate: возвращает положительное число, если объект, для которого он вызывается, находится после аргумента, вам необходимо проверить начало ‹= 900 и конец >= −900. Кроме того, вы можете упростить свой код, используя timeIntervalSinceNow вместо того, чтобы вручную получать текущую дату и передавать ее в timeIntervalSinceDate:. Наконец, если вы можете предположить (или предварительно убедиться), что начало предшествует концу, то вам не нужны два промежуточных теста, так как они оба должны быть истинными, чтобы оба других были истинными.

if([self.start timeIntervalSinceNow] <= 900 && [self.end timeIntervalSinceNow] >= −900) {
    NSLog(@"In range")
}
07.04.2011
  • Это лучший ответ, чем мой. 07.04.2011
  • Это сработало, и похоже, что моя первая закомментированная попытка была самой близкой. Спасибо за помощь! 07.04.2011

  • 2

    Вот какой-то многословный (и глупый) код, объясняющий мой подход к этой проблеме.

    NSTimeInterval secondsBeforeStart = [self.start timeIntervalSinceNow];
    if ( secondsBeforeStart > (15 * 60))
    {
        // The result for '[self.start timeIntervalSinceNow]' is positive as long
        //  as 'self.start' remains in the future. We're not in range until there
        //  are 900 seconds to go or less.
        NSLog( @"Still time to chill.");
    
        // More than fifteen minutes to go so return NO.
        return NO;
    }
    else
    {
        NSLog( @"OMG did I miss it!!!");
        NSTimeInterval secondsBeforeEnd = [self.end timeIntervalSinceNow];
        if ( secondsBeforeEnd < -( 15 * 60))
        {
            // The result for '[self.end timeIntervalSinceNow]' is negative when
            //  'self.end' is in the past. 
            // It's been more than 900 seconds since the end of the appointment
            //  so we've missed it.
            NSLog( @"Ahhhhh!!!");
    
            // More than 900 seconds past the end of the event so return NO.
            return NO;
        }
        else
        {
            // We are somewhere between 900 seconds before the start and
            //  900 seconds before the end so we are golden.
            NSLog( @"Whew, we made it.");
            return YES;
        }
    }
    

    То, как я закодировал бы это, было бы

    BOOL inRange = NO;  // Assume we are not in the proper time range.
    
    if ( [self.start timeIntervalSinceNow] <= ( 15 * 60))
    {
        // 'Now' is at least 900 seconds before the start time but could be later.
        if ( [self.end timeIntervalSinceNow] >= -( 15 * 60))
        {
            // 'Now' is not yet 900 seconds past the end time.
            inRange = YES
        }
    }
    
    return inRange;
    

    Примечание. На самом деле я не компилировал это, но я уверен, что логика верна.

    Наконец, вы заметили, что ваши последние две строки

        return NO;
    
        [now release];
    }
    

    создал бы утечку памяти. (Отпустить, а затем вернуться ;^))

    07.04.2011
  • Это был трудный выбор между вами и @ughoavgfhw, поскольку вы оба сказали одно и то же, но в итоге код @ughoavgfhw был практически идентичен тому, что написал я, поэтому я согласился с ним. ОДНАКО, я благодарю вас за сообщение lol и за подсказку об утечке. 07.04.2011

  • 3

    Это проблема расстояния — вы хотите знать, находится ли текущее время в пределах 900 секунд от целевого времени. Вычислите задачи расстояния, взяв абсолютное значение разницы между двумя точками. Принимая абсолютное значение разницы, порядок двух выборок не имеет значения.

    /** 
     * @brief Return YES if the current time is within 900 seconds of the meeting time (NSDate* time).
     */
    -(BOOL)currentTimeIsWithin900SecondsOf:(NSDate*)time
    {
        NSDate* now = [NSDate date];
        return fabs( [now timeIntervalSinceReferenceDate] - [time timeIntervalSinceReferenceDate] ) < 900;
    }
    
    07.04.2011

    4

    Вам нужно создать три NSDate. Затем преобразуйте NSDates во временные интервалы, используя intervalSinceReferenceDate, и сравните их. Вы вручную настраиваете NSDate с помощью NSDateComponents.

    07.04.2011
    Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...