Como posso obter o ano / mês / dia de um NSDate
objeto, sem outras informações? Percebo que provavelmente poderia fazer isso com algo semelhante a isto:
NSCalendar *cal = [[NSCalendar alloc] init];
NSDateComponents *components = [cal components:0 fromDate:date];
int year = [components year];
int month = [components month];
int day = [components day];
Mas isso parece ser muito complicado para algo tão simples quanto obter um NSDate
ano / mês / dia. existe alguma outra solução?
objective-c
nsdate
nsdatecomponents
nscalendar
Richard J. Ross III
fonte
fonte
Respostas:
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 porNSDate
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 queNSDate
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: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çõesNSDateComponents
podem ser encontradas naNSDateComponents
Referência de classe .Para referência, o acesso a componentes individuais a partir do
NSDateComponents
é bastante fácil: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çãoNSCalendar
para fornecer essas informaçõesNSCalendarUnit
)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 geradorNSCalendar
com aNSCalendarUnitEra
bandeira.fonte
NSCalendar
O+currentCalendar
método retornará o calendário do sistema e, se o telefone do usuário estiver definido no modo de horário japonês ou tailandês, você terá um ano diferente. Se você deseja forçar um sistema de calendário específico, crie um calendário e inicialize-o com o código do idioma apropriado. Por exemplo, para forçar um calendário gregoriano, você vai querer usar o seguinte:[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]
Você pode obter um componente separado de um NSDate usando o NSDateFormatter:
Se você deseja obter o número do mês em vez da abreviação, use "MM". Se você deseja obter números inteiros, use
[myDayString intValue];
fonte
Apenas para reformular o código excelente (e funcionando!) Do Itai, eis a aparência de uma classe auxiliar de amostra, para retornar o valor do ano de uma determinada variável NSDate.
Como você pode ver, é fácil modificar esse código para obter o mês ou o dia.
(Não acredito que precisamos escrever nossas próprias funções básicas de data para iOS, em 2013 ...)
Outra coisa: nunca use <e> para comparar dois valores do NSDate.
O XCode aceitará com prazer esse código (sem erros ou avisos), mas seus resultados são uma loteria. Você deve usar a função "compare" para comparar o NSDates:
fonte
No Swift 2.0:
fonte
Estou escrevendo esta resposta porque é a única abordagem que não fornece opcionais a partir de
NSDateComponent
variáveis e / ou força a desembrulhar essas variáveis (também para o Swift 3).Swift 3
Swift 2
Bonus Swift 3 versão divertida
fonte
Novo no iOS 8
ObjC
Rápido
fonte
Se você estiver segmentando o iOS 8 ou superior, poderá usar os novos
NSCalendar
métodos de conveniência para conseguir isso em um formato mais conciso.Primeiro crie um
NSCalendar
e use o queNSDate
for necessário.Você pode extrair componentes individualmente via
component:fromDate:
Ou, ainda mais sucintamente, use
NSInteger
ponteiros viagetEra:year:month:day:fromDate:
Para obter mais informações e exemplos, consulte o NSDate Manipulation Made Easy no iOS 8 . Disclaimer, eu escrevi o post.
fonte
No iOS 8.0 (e no OS X 10), você pode usar o método component para simplificar a obtenção de um único componente de data, como:
Deve tornar as coisas mais simples e espero que isso seja implementado com eficiência.
fonte
Se você deseja obter os NSDateComponents individuais do NSDate, definitivamente precisaria da solução sugerida pelo Itai Ferber. Mas se você quiser ir do NSDate diretamente para um NSString, poderá usar o NSDateFormatter .
fonte
fonte
Aqui está a solução no Swift:
fonte
Tente isso. . .
Fragmento de código:
Dá ano, mês, data atual
fonte
Tente o seguinte:
fonte
Swift 2.x
Você pode usá-lo como
Resultado
fonte
Rápido
A maneira mais fácil de obter qualquer elemento de data como uma String opcional.
fonte
eu faço assim ....
fonte
Para obter uma sequência legível por humanos (dia, mês, ano), você pode:
fonte