Поскольку это, по-видимому, мой самый популярный ответ, я постараюсь отредактировать его, чтобы он содержал немного больше информации.
Несмотря на свое название, NSDateсамо по себе это просто точка машинного времени, а не дата. Не существует корреляции между моментом времени, указанным NSDateи годом, месяцем или днем. Для этого вам нужно обратиться к календарю. Любой данный момент времени будет возвращать различную информацию о дате в зависимости от того, какой календарь вы просматриваете (например, даты не совпадают в григорианском и еврейском календарях), а григорианский календарь является наиболее широко используемым календарем в Мир - я предполагаю - мы немного предвзяты, что NSDateвсегда должны его использовать. NSDateК счастью, гораздо более двухпартийный.
Как NSCalendarвы упомянули, получение даты и времени должно будет пройти , но есть более простой способ сделать это:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Это создает NSDateComponentsобъект, содержащий день, месяц и год из текущего системного календаря на текущий день. ( Примечание: это не обязательно текущий пользовательский календарь, а только системный календарь по умолчанию.)
Конечно, если вы используете другой календарь или дату, вы можете легко это изменить. Список доступных календарей и календарных единиц можно найти в NSCalendarсправочнике классов . Более подробную информацию о NSDateComponentsможно найти в NSDateComponentsсправочнике классов .
Для справки, получить доступ к отдельным компонентам из NSDateComponentsдовольно просто:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Вы просто должны быть внимательны: NSDateComponentsне будет содержать достоверную информацию для каких-либо полей, которые вы запрашиваете, если только вы не сгенерировали их с этой действительной информацией (т.е. запросите NSCalendarпредоставление этой информации с помощью NSCalendarUnits). NSDateComponentsсами по себе не содержат справочной информации - это просто простые структуры, которые содержат номера для доступа к ним. Если вы хотите также получить эру, например, NSDateComponentsвам нужно передать метод генератора из NSCalendarс NSCalendarUnitEraфлагом.