Como verificar se um NSDate
pertence a hoje?
Eu costumava checá-lo usando os 10 primeiros caracteres de [aDate description]
. [[aDate description] substringToIndex:10]
retorna string "YYYY-MM-DD"
assim, eu comparei a string com a string retornada por [[[NSDate date] description] substringToIndex:10]
.
Existe uma maneira mais rápida e / ou limpa de verificar?
Obrigado.
ios
objective-c
cocoa-touch
nsdate
nscalendar
Seunghoon
fonte
fonte
Respostas:
No macOS 10.9+ e iOS 8+, existe um método no NSCalendar / Calendar que faz exatamente isso!
Então você simplesmente faria
Objetivo-C:
Swift 3:
fonte
Você pode comparar os componentes da data:
Editar:
Eu gosto mais do método de stefan, acho que torna uma declaração if mais limpa e compreensível:
Chris, eu incorporei sua sugestão. Eu tive que procurar o que era era, então para quem não sabe, ele distingue entre BC e AD. Provavelmente, isso é desnecessário para a maioria das pessoas, mas é fácil verificar e acrescenta alguma certeza, então eu a incluí. Se você está buscando velocidade, esse provavelmente não é um bom método.
OBSERVAÇÃO Como em muitas respostas sobre SO, após 7 anos, isso está totalmente desatualizado. No Swift agora basta usar
.isDateInToday
fonte
Esta é uma ramificação para sua pergunta, mas se você deseja imprimir um NSDate com "Hoje" ou "Ontem", use a função
para NSDateFormatter
fonte
Eu tentaria obter a data de hoje normalizada para meia-noite e a segunda data, normalizar para meia-noite e comparar se é a mesma NSDate.
De um exemplo da Apple, veja como você normaliza para a meia-noite da data de hoje, faça o mesmo para a segunda data e compare:
fonte
Working Swift 3 e 4 extensão da sugestão de Catfish_Man:
fonte
Não há necessidade de fazer malabarismos com componentes, eras e outras coisas.
O NSCalendar fornece um método para obter o início de uma determinada unidade de tempo para uma data existente.
Este código terá o início de hoje e outra data e comparará isso. Se for avaliado
NSOrderedSame
, as duas datas são no mesmo dia - hoje.fonte
Trabalhou para mim no Swift 2.0
fonte
Versão rápida da melhor resposta:
fonte
Consulte a entrada de documentação da Apple intitulada "Executando cálculos de calendário" [link] .
A Listagem 13 dessa página sugere que, para determinar o número de meia-noite entre os dias, use:
Você pode determinar se dois dias são iguais usando esse método e verificando se ele retorna 0 ou não.
fonte
Você também pode verificar o intervalo de tempo entre a data que você tem e a data atual:
Isso fornecerá o intervalo de tempo, em segundos, entre myDate e a data / hora atual.
Link .
Edit: Note to everyone: Estou ciente de que [myDate timeIntervalSinceNow] não determina inequivocamente se myDate é hoje.
Estou deixando esta resposta como está, para que, se alguém estiver procurando por algo semelhante e [myDate timeIntervalSinceNow] seja útil, eles poderão encontrá-la aqui.
fonte
timeIntervalSinceNow
medida que ela é abordada em muitos outros posts. A manipulação da comparação do dia com a verificação de segundos incentiva a divisão propensa a erros em 86400.Extensão Swift com base nas melhores respostas:
fonte
Se você tiver muitas dessas comparações de datas, as chamadas para
calendar:components:fromDate
começarão a demorar muito tempo. De acordo com alguns perfis que fiz, eles parecem bastante caros.Digamos que você esteja tentando determinar quais de algumas datas, digamos
NSArray *datesToCompare
, são o mesmo dia que um determinado dia, digamosNSDate *baseDate
, então você pode usar algo como o seguinte (parcialmente adaptado de uma resposta acima):Resultado:
fonte
Existe uma maneira mais fácil do que muitas das respostas acima!
fonte
Provavelmente isso poderia ser reformulado como uma categoria NSDate, mas eu usei:
(No entanto, comparar as duas cadeias de datas como na pergunta original quase parece "mais limpo" ..)
fonte
comps
quando você os define imediatamente como zero? Além disso, acho que você precisa incluir a época.para iOS7 e versões anteriores:
fonte
Confira os excelentes artigos de Erica Sadun
NSDate extension
. Muito simples de usar. Multa aqui:http://github.com/erica/NSDate-Extensions
Já está disponível neste post: https://stackoverflow.com/a/4052798/362310
fonte
A solução correta e segura sem forçar a quebra, trabalhando no Swift 2.2 e antes do iOS 8:
fonte
Aqui está a minha resposta de 2 centavos com base na resposta aceita, mas também com suporte à API mais recente. Nota: Eu uso o calendário gregoriano, pois a maioria dos carimbos de hora é GMT, mas altere a sua como achar melhor
fonte
Minha solução é calcular quantos dias passaram desde 1970 por divisão e comparar a parte inteira
fonte
fonte