Como essa é aparentemente a minha resposta mais popular, tentarei editá-la para conter um pouco mais de informação.
Apesar do nome, NSDatepor si só marca um ponto no tempo da máquina, não uma data. Não há correlação entre o ponto no tempo especificado por NSDatee um ano, mês ou dia. Para isso, você deve consultar um calendário. Qualquer ponto no tempo retornará informações de data diferentes com base no calendário que você está visualizando (as datas não são as mesmas nos calendários gregoriano e judaico, por exemplo) e, embora o calendário gregoriano seja o calendário mais usado no mundo - presumo - somos um pouco tendenciosos que NSDatesempre devem usá-lo. NSDate, felizmente, é muito mais bipartidário.
A obtenção de data e hora terá que passar NSCalendar, como você mencionou, mas há uma maneira mais simples de fazer isso:
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear fromDate:[NSDate date]];
Isso gera um NSDateComponentsobjeto que contém o dia, mês e ano do calendário atual do sistema para o dia atual. ( Nota: este não é necessariamente o calendário atual especificado pelo usuário , apenas o calendário padrão do sistema.)
Obviamente, se você estiver usando um calendário ou data diferente, poderá mudar isso facilmente. Uma lista de calendários e unidades de calendário disponíveis pode ser encontrada na NSCalendarReferência da turma . Mais informações NSDateComponentspodem ser encontradas na NSDateComponentsReferência de classe .
Para referência, o acesso a componentes individuais a partir do NSDateComponentsé bastante fácil:
NSInteger day = [components day];
NSInteger month = [components month];
NSInteger year = [components year];
Você só precisa ter cuidado: NSDateComponentsnão conterá informações válidas para os campos solicitados, a menos que você os tenha gerado com essas informações válidas (por exemplo, solicitação NSCalendarpara fornecer essas informações NSCalendarUnit) NSDateComponentsnão contêm informações de referência por si só - são apenas estruturas simples que contêm números para você acessar. Se você também deseja obter uma era, por exemplo, NSDateComponentsprecisará alimentar o método gerador NSCalendarcom a NSCalendarUnitErabandeira.