Como essa é aparentemente a minha resposta mais popular, tentarei editá-la para conter um pouco mais de informação.
Apesar do nome, NSDate
por 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 NSDate
e 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 NSDate
sempre 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 NSDateComponents
objeto 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 NSCalendar
Referência da turma . Mais informações NSDateComponents
podem ser encontradas na NSDateComponents
Referê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: NSDateComponents
nã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 NSCalendar
para fornecer essas informações NSCalendarUnit
) NSDateComponents
nã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, NSDateComponents
precisará alimentar o método gerador NSCalendar
com a NSCalendarUnitEra
bandeira.