tl; dr
LocalDate today = LocalDate.now(ZoneId.of("America/Montreal")) ;
Boolean isBetween =
(! today.isBefore(localDate1)) // “not-before” is short for “is-equal-to or later-than”.
&&
today.isBefore(localDate3) ;
O, mejor, si agrega el ThreeTen-Extra biblioteca para su proyecto.
LocalDateRange.of(
LocalDate.of(…) ,
LocalDate.of(…)
).contains(
LocalDate.now()
)
enfoque semiabierto, en principio es incluido mientras que termina es exclusiva .
Mala elección del formato
Por cierto, que es una mala elección del formato de una representación de texto de un valor de fecha o de fecha y hora. Siempre que sea posible, cumpla con los formatos estándar ISO 8601. Los formatos ISO 8601 son inequívocos, comprensibles en todas las culturas humanas, y son fáciles de analizar por máquina.
Para un valor de fecha solamente, el formato estándar es AAAA-MM-DD. Tenga en cuenta que este formato tiene el beneficio de ser cronológico cuando se ordena alfabéticamente.
LocalDate
La clase LocalDate
representa un valor de sólo fecha sin la hora del día y sin zona horaria.
Una zona horaria es crucial para determinar una fecha. Para cualquier momento dado, la fecha varía alrededor del mundo por zona. Por ejemplo, unos minutos después de la medianoche en Paris France es un nuevo día mientras aún está "ayer" en Montréal Québec.
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
DateTimeFormatter
A medida que sus cadenas de entrada son de formato no estándar, hay que definir un patrón de formato para que coincida.
DateTimeFormatter f = DateTimeFormatter.ofPattern("dd-MM-uuuu");
Utilícelo para analizar las cadenas de entrada.
LocalDate start = LocalDate.parse("22-02-2010" , f);
LocalDate stop = LocalDate.parse("25-12-2010" , f);
En el trabajo a tiempo la fecha, por lo general la mejor manera de definir un espacio de tiempo por el enfoque de medio abierto, donde el principio es incluido, mientras que el final es exclusiva . Entonces, queremos saber si hoy es igual o más tarde que el comienzo y también antes de la parada. Una forma más breve de decir "es igual o más tarde que el comienzo" es "no antes del inicio".
Boolean intervalContainsToday = (! today.isBefore(start)) && today.isBefore(stop) ;
Ver the Answer by gstackoverflow que muestra la lista de los métodos de comparación que puede llamar.
Sobre java.time
El marco java.time está incorporado en Java 8 y versiones posteriores. Estas clases suplantan a las viejas y problemáticas clases de fecha y hora legacy, como java.util.Date
, Calendar
, & SimpleDateFormat
.
El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.
Para obtener más información, consulte el Oracle Tutorial. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.
¿Dónde obtener las clases java.time?
- Java SE 8 y SE 9 y más tarde
- incorporado.
- Parte de la API estándar de Java con una implementación integrada.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
- Android
El proyecto se extiende ThreeTen-Extra java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval
, YearWeek
, YearQuarter
y more.
ACTUALIZACIÓN: Esta sección "Joda-Time" a continuación se deja intacta como la historia. El proyecto Joda-Time, ahora en maintenance mode, recomienda la migración a las clases java.time.
Joda-Time
Otras respuestas son correctas con respecto a las clases y java.util.Date java.util.Calendar en paquete. Pero esas clases son notoriamente problemáticas. Así que aquí hay un código de ejemplo usando la biblioteca Joda-Time 2.3.
Si realmente desea una fecha sin una porción de tiempo y sin zona horaria, utilice la clase LocalDate
en Joda-Time. Esa clase proporciona métodos de comparación que incluyen compareTo
(usado con Java Comparators), isBefore
, isAfter
y isEqual
.
entradas ...
String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";
definir un formateador que describe las cadenas de entrada ...
DateTimeFormatter formatter = DateTimeFormat.forPattern("dd-MM-yyyy");
Uso formateador para analizar las cadenas en objetos LocalDate ...
LocalDate localDate1 = formatter.parseLocalDate(string1);
LocalDate localDate2 = formatter.parseLocalDate(string2);
LocalDate localDate3 = formatter.parseLocalDate(string3);
boolean is1After2 = localDate1.isAfter(localDate2);
boolean is2Before3 = localDate2.isBefore(localDate3);
volcado a la consola ...
System.out.println("Dates: " + localDate1 + " " + localDate2 + " " + localDate3);
System.out.println("is1After2 " + is1After2);
System.out.println("is2Before3 " + is2Before3);
Cuando ejecute ...
Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true
ver Así que si la segunda es entre los otros dos (en exclusiva, es decir, no es igual a los puntos finales) ...
boolean is2Between1And3 = ((localDate2.isAfter(localDate1)) && (localDate2.isBefore(localDate3)));
Trabajar con espacios de tiempo
Si está trabajando con una gran cantidad de tiempo, le sugiero que explore en Joda-Time las clases: Duration, Interval y Period. Métodos como overlap
y contains
facilitan las comparaciones.
Para representaciones de texto, mira de la norma ISO 8601:
- duration
Formato: PnYnMnDTnHnMnS
Ejemplo: P3Y6M4DT12H30M5S
(Medios “tres años, seis meses, cuatro días, doce horas, treinta minutos, y cinco segundos”)
- interval
Formato: inicio/final
Ejemplo: 2007-03-01T13: 00: 00Z/2008-05-11T15: 30: 00Z
Las clases Joda-Time pueden trabajar con cadenas en ambos formatos, tanto como entrada (análisis sintáctico) como de salida (generación de cadenas).
Joda-Time realiza comparaciones utilizando el enfoque dede medio abierto donde el comienzo del tramo es incluido, mientras que el final es exclusiva . Este enfoque es acertado para manejar períodos de tiempo. Busque StackOverflow para obtener más información.
Es esto inclusive, o exclusivo para las fronteras? –
@ DanielHári no es inclusivo. puede usar la solución sugerida en el primer comentario o usar CompareTo()> = 0. – Mifmif
La normalidad generalmente "izquierda inclusiva, derecha exclusiva", esta es la razón por la que creo que esto debe especificarse exactamente. Con los bordes "izquierda inclusiva, derecha exclusiva", puede especificar fe: un intervalo de un mes fácilmente: [2016/04/01, 2016/05/01], esta es la razón por la cual esto es lo normal y se usa por defecto en muchos casos de uso. –