Estou tentando descobrir se a data atual cai ou não em um intervalo de datas usando NSDate.
Por exemplo, você pode obter a data / hora atual usando NSDate:
NSDate rightNow = [NSDate date];
Eu gostaria então de usar essa data para verificar se ela está entre 9h e 17h .
objective-c
cocoa
cocoa-touch
datetime
nsdate
Brock Woolf
fonte
fonte
Respostas:
Eu encontrei uma solução. Se você tiver uma solução melhor, fique à vontade para deixá-la e irei marcá-la como correta.
fonte
- (BOOL)isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;
return !([date compare:startDate] == NSOrderedAscending || [date compare:endDate] == NSOrderedDescending);
Para a primeira parte, use a resposta de @kperryua para construir os objetos NSDate com os quais deseja comparar. Com base na sua resposta à sua própria pergunta, parece que você já descobriu isso.
Para realmente comparar as datas, concordo totalmente com o comentário de @Tim sobre sua resposta. É mais conciso, mas na verdade exatamente equivalente ao seu código, e explicarei por quê.
Embora possa parecer que a instrução return deve avaliar ambos os operandos do operador &&, este não é realmente o caso. A chave é " avaliação de curto-circuito ", que é implementada em uma ampla variedade de linguagens de programação, e certamente em C. Basicamente, os operadores
&
e&&
"curto-circuito" se o primeiro argumento for 0 (ou NÃO, nulo, etc.) , while|
e||
faça o mesmo se o primeiro argumento não for 0. Sedate
vier antesbeginDate
, o teste retornaNO
sem nem mesmo precisar comparar comendDate
. Basicamente, ele faz a mesma coisa que seu código, mas em uma única instrução em uma linha, não 5 (ou 7, com espaço em branco).A intenção é ser uma entrada construtiva, pois, quando os programadores entendem a maneira como sua linguagem de programação particular avalia as expressões lógicas, eles podem construí-las de maneira mais eficaz, sem tanto esforço. No entanto, existem testes semelhantes que seriam menos eficientes, uma vez que nem todos os operadores entram em curto-circuito. (Na verdade, a maioria não pode entrar em curto-circuito, como operadores de comparação numérica.) Em caso de dúvida, é sempre seguro ser explícito ao quebrar sua lógica, mas o código pode ser muito mais legível quando você deixa a linguagem / compilador lidar com as pequenas coisas para voce.
fonte
Versão de Brock Woolf em Swift:
fonte
Se você quiser saber se a data atual cai entre dois pontos dados no tempo (9h - 17h em 01/07/09), use NSCalendar e NSDateComponents para construir instâncias NSDate para os horários desejados e compará-los com a data atual.
Se você quiser saber se a data atual cai entre essas duas horas todos os dias, provavelmente você poderia ir de outra maneira. Crie um objeto NSDateComponents com e NSCalendar e seu NSDate e compare os componentes de hora.
fonte
Se você puder direcionar o iOS 10.0 + / macOS 10.12+, use a
DateInterval
classe.Primeiro, crie um intervalo de datas com datas de início e término:
Em seguida, verifique se a data está no intervalo usando o
contains
método deDateInterval
:fonte
Isso pode ser feito facilmente usando os intervalos de tempo das datas, como:
fonte
Continuando com as soluções de Quinn e Brock, é muito bom implementar a subclasse NSDate, então ela pode ser usada em qualquer lugar assim:
E em qualquer parte do seu código, você pode usá-lo como:
(myNSDate, thisNSDate e thatNSDate são, obviamente, NSDates :)
fonte
Há uma solução melhor e mais rápida para esse problema.
Então você pode chamá-lo assim.
Até mesmo você pode passar datas aleatórias, já que esta extensão verifica qual é o mínimo e qual não é.
você pode usá-lo no swift 3 e superior.
fonte
Com o Swift 5, você pode usar uma das duas soluções abaixo para verificar se uma data ocorre entre duas outras datas.
# 1. Usando
DateInterval
ocontains(_:)
método deDateInterval
tem um método chamadocontains(_:)
.contains(_:)
tem a seguinte declaração:O seguinte código Playground mostra como usar
contains(_:)
para verificar se uma data ocorre entre duas outras datas:# 2. Usando
ClosedRange
ocontains(_:)
método deClosedRange
tem um método chamadocontains(_:)
.contains(_:)
tem a seguinte declaração:O seguinte código Playground mostra como usar
contains(_:)
para verificar se uma data ocorre entre duas outras datas:fonte
Uma versão melhor em Swift:
fonte