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 ответа:
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: для получения дня недели-как показано в следующем примере.Но я думаю, что вы можете установить свойство календаря NSDateComponent, чтобы исправить это.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];