Nscalendar datefromponents: vs 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];
Есть ли разница между этими двумя методами? Если да, то какой из них следует использовать и почему?
2 2

2 ответа:

NSDate *date = [components date];

Является идентичным к

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

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

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

NSDate *date = [calendar dateFromComponents:components];

Или

[components setCalendar:calendar];
NSDate *date = [components date];
И нет никакой разницы между этими двумя методами.

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

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

Экземпляр NSDateComponents не несет ответственности за ответы на вопросы о дате, выходящей за рамки информации, с которой он был инициализирован. Например, если вы инициализируете один из них с 6 мая 2004 года, его будний день - NSUndefinedDateComponent, а не Четверг. Чтобы получить правильный день недели, необходимо создать подходящий экземпляр NSCalendar, создать объект NSDate с помощью datefromponents: и затем использовать components: 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];
Но я думаю, что вы можете установить свойство календаря NSDateComponent, чтобы исправить это.