Arhn - архитектура программирования

NSCalendar dateFromComponents: против даты NSDateComponents

Скажем, у меня есть следующий код, который инициализирует NSDateComponents:

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:1987];
[components setMonth:3];
[components setDay:17];
[components setHour:14];
[components setMinute:20];
[components setSecond:0];

И теперь я хочу преобразовать компоненты в NSDate. Вроде есть два пути:

Способ 1:

NSDate *date = [calendar dateFromComponents:components];

Способ 2:

NSDate *date = [components date];

Есть ли разница между этими двумя методами? Если да, то какой из них следует использовать и почему?


Ответы:


1
NSDate *date = [components date];

идентично

NSDate *date = [[components calendar] dateFromComponents:comps];

и он возвращает nil, если вы не назначили календарь компонентам даты. Вы можете убедиться в этом, задав переменную среды NSObjCMessageLoggingEnabled=YES в схеме проектов и пронаблюдав в сгенерированной трассировке сообщения (/tmp/msgSends-NNNN), что вызываются точно такие же методы.

Это означает, что вы можете позвонить

NSDate *date = [calendar dateFromComponents:components];

or

[components setCalendar:calendar];
NSDate *date = [components date];

и между этими двумя методами нет разницы.

01.03.2014
  • Итак, разница между двумя альтернативами, которые есть у ОП, заключается в том, что когда он использует календарь, а когда он не использует календарь (что не удастся, см. ответ nickH) 01.03.2014
  • Я понимаю, что это идентично, если вы назначите календарь для компов, но это не то, что есть у OP. 01.03.2014
  • @Daij-Djan: NickH сказал, что вопросы, относящиеся к определенному календарю (например, григорианскому), не определены, если вы не назначаете календарь. Моя точка зрения заключалась в том, что результат обычно равен [components date] = nil, если вы не назначаете календарь. Разница может быть небольшой, но мне показалось, что она заслуживает отдельного ответа. Также пример, который привел NickH, кажется мне не связанным с этой проблемой. 01.03.2014
  • @MartinR Обычно я устанавливаю календарь, когда мне приходится использовать такие компоненты, поэтому я не знал, что он будет полностью нулевым. И просто для справки, пример и цитируемый выше текст были взяты из документации Apple, на которую я ссылался, поэтому это не имело прямого отношения, но я подумал, что это даст полный контекст, изначально написанный Apple. Ваш ответ определенно более полный и лучше изучен, чем мой. 04.03.2014
  • Сегодня утром я профилировал свой собственный код, связанный с этой проблемой. Вызов [components setCalendar] занимал 94% времени метода. Я удалил этот вызов и использовал [calendar dateFromComponents], и это значительно сократило временной профиль. Он изменился на 34% с [компонентами календаря: fromDate] и 64% [календарная датаFromComponents]. Определенная разница. 05.03.2014
  • @androider: Это интересно. Я использовал трассировку сообщений для отслеживания одного вызова обоих вариантов и не заметил никакой разницы. Я проверю это позже. Спасибо за ответ! 05.03.2014
  • @MartinR Я должен уточнить, что 34% и 64% - это время, затраченное на выполнение этих двух функций в одном и том же вызове метода. Однако общее время выполнения метода сократилось. 05.03.2014

  • 2

    Я считаю, что у NSDateComponents нет календаря, установленного по умолчанию. Таким образом, вопросы, относящиеся к определенному календарю (например, григорианскому), не определены.

    Согласно документации Apple здесь:

    Экземпляр NSDateComponents не отвечает за ответы на вопросы о дате помимо информации, с которой он был инициализирован. Например, если вы инициализируете один из них 6 мая 2004 г., его днем ​​недели будет NSUndefinedDateComponent, а не четверг. Чтобы получить правильный день недели, вы должны создать подходящий экземпляр NSCalendar, создать объект NSDate с помощью dateFromComponents: и затем использовать компоненты:fromDate: для получения дня недели, как показано в следующем примере.

    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setDay:6];
    [comps setMonth:5];
    [comps setYear:2004];
    NSCalendar *gregorian = [[NSCalendar alloc]
        initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *date = [gregorian dateFromComponents:comps];
    [comps release];
    NSDateComponents *weekdayComponents =
        [gregorian components:NSWeekdayCalendarUnit fromDate:date];
    int weekday = [weekdayComponents weekday];
    

    Но я считаю, что вы можете установить свойство Calendar NSDateComponent, чтобы исправить это.

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

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..