Estoy tratando de averiguar si la fecha actual se encuentra dentro de un rango de fechas usando NSDate.
Por ejemplo, puede obtener la fecha / hora actual usando NSDate:
NSDate rightNow = [NSDate date];
Después me gustaría utilizar esa fecha para comprobar si está en el rango de 09 a.m.-5 p.m. .
objective-c
cocoa
cocoa-touch
datetime
nsdate
Brock Woolf
fuente
fuente
Respuestas:
Se me ocurrió una solución. Si tiene una solución mejor, no dude en dejarla y la marcaré como correcta.
fuente
- (BOOL)isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;
return !([date compare:startDate] == NSOrderedAscending || [date compare:endDate] == NSOrderedDescending);
Para la primera parte, use la respuesta de @kperryua para construir los objetos NSDate con los que desea comparar. De su respuesta a su propia pregunta, parece que ya lo ha resuelto.
Para comparar las fechas, estoy totalmente de acuerdo con el comentario de @Tim sobre su respuesta. Es más conciso pero en realidad es exactamente equivalente a su código, y explicaré por qué.
Aunque pueda parecer que la declaración de retorno debe evaluar ambos operandos del operador &&, este no es el caso. La clave es " evaluación de cortocircuito ", que se implementa en una amplia variedad de lenguajes de programación, y ciertamente en C. Básicamente, los operadores
&
y&&
"cortocircuito" si el primer argumento es 0 (o NO, nil, etc.) , while|
y||
hacen lo mismo si el primer argumento no es 0. Sidate
viene antesbeginDate
, la prueba devuelveNO
sin necesidad de comparar conendDate
. Básicamente, hace lo mismo que su código, pero en una sola declaración en una línea, no 5 (o 7, con espacios en blanco).Esto tiene la intención de ser una entrada constructiva, ya que cuando los programadores comprenden la forma en que su lenguaje de programación particular evalúa las expresiones lógicas, pueden construirlas de manera más efectiva sin tanto sobre la eficiencia. Sin embargo, existen pruebas similares que serían menos eficientes, ya que no todos los operadores cortocircuitan. (De hecho, la mayoría no puede hacer cortocircuitos, como los operadores de comparación numérica). En caso de duda, siempre es seguro ser explícito al dividir su lógica, pero el código puede ser mucho más legible cuando deja que el lenguaje / compilador maneje las pequeñas cosas para ti.
fuente
Versión de Brock Woolf en Swift:
fuente
Si desea saber si la fecha actual se encuentra entre dos momentos determinados (de 9 a. M. A 5 p. M. El 1 de julio de 2009), use NSCalendar y NSDateComponents para crear instancias de NSDate para los tiempos deseados y compárelas con la fecha actual.
Si desea saber si la fecha actual se encuentra entre estas dos horas todos los días, probablemente podría ir al revés. Cree un objeto NSDateComponents con y NSCalendar y su NSDate y compare los componentes de la hora.
fuente
Si puede orientar sus anuncios a iOS 10.0 + / macOS 10.12+, utilice la
DateInterval
clase.Primero, cree un intervalo de fechas con una fecha de inicio y finalización:
Luego, verifique si la fecha está en el intervalo usando el
contains
método deDateInterval
:fuente
Esto se puede lograr fácilmente usando los intervalos de tiempo de las fechas, así:
fuente
Continuando con las soluciones de Quinn y Brock, es muy bueno subclasificar la implementación de NSDate, por lo que se puede usar en todas partes de esta manera:
Y en cualquier parte de su código puede usarlo como:
(myNSDate, thisNSDate y thatNSDate son, por supuesto, NSDates :)
fuente
Existe una solución mejor y más rápida para este problema.
Entonces puedes llamarlo así.
Incluso puede pasar la fecha al azar, ya que esta extensión comprueba cuál es mínima y cuál no.
puedes usarlo en swift 3 y superior.
fuente
Con Swift 5, puede usar una de las dos soluciones a continuación para verificar si ocurre una fecha entre otras dos fechas.
# 1. Usando
DateInterval
elcontains(_:)
método deDateInterval
tiene un método llamadocontains(_:)
.contains(_:)
tiene la siguiente declaración:El siguiente código de Playground muestra cómo usarlo
contains(_:)
para verificar si una fecha ocurre entre otras dos fechas:# 2. Usando
ClosedRange
elcontains(_:)
método deClosedRange
tiene un método llamadocontains(_:)
.contains(_:)
tiene la siguiente declaración:El siguiente código de Playground muestra cómo usarlo
contains(_:)
para verificar si una fecha ocurre entre otras dos fechas:fuente
Una mejor versión en Swift:
fuente