in

¿Cómo comparar fechas en Java?

apple touch icon@2
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 a su proyecto.

LocalDateRange.of(
    LocalDate.of( … ) ,
    LocalDate.of( … )
).contains(
    LocalDate.now()
)

Enfoque semiabierto, donde el comienzo es inclusivo mientras que el final es exclusivo.

Por cierto, esa es una mala elección de formato para una representación de texto de una fecha o un valor de fecha y hora. Siempre que sea posible, siga el estándar ISO 8601 formatos. 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 solo fecha, el formato estándar es AAAA-MM-DD. Tenga en cuenta cómo este formato tiene la ventaja de ser cronológico cuando se ordena alfabéticamente.

los LocalDate class representa un valor de solo fecha sin hora del día y sin zona horaria.

Una zona horaria es crucial para determinar una fecha. Para un momento dado, la fecha varía en todo el mundo según la zona. Por ejemplo, unos minutos después de la medianoche en París, Francia es un nuevo día mientras sigue siendo «ayer» en Montreal, Quebec.

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

Tabla de todos los tipos de fecha y hora en Java, tanto modernos como heredados

Como sus cadenas de entrada tienen un formato no estándar, debemos definir un patrón de formato para que coincida.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );

Úselo 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 de fecha y hora, generalmente es mejor definir un lapso de tiempo mediante el enfoque semiabierto donde el comienzo es inclusivo mientras el final es exclusivo. Por eso queremos saber si hoy es igual o más tarde que el inicio 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 comienzo».

Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;

Vea la Respuesta de gstackoverflow que muestra la lista de métodos de comparación a los que puede llamar.


los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan al viejo problemático legado clases de fecha y hora como java.util.Date, CalendarY SimpleDateFormat.

Para obtener más información, consulte el Tutorial de Oracle. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

los Joda-Time proyecto, ahora en modo de mantenimiento, aconseja la migración a la java.time clases.

Puedes intercambiar java.time objetos directamente con su base de datos. Utilizar una Controlador JDBC conforme con JDBC 4.2 o después. Sin necesidad de cuerdas, sin necesidad de java.sql.* clases. Compatibilidad con Hibernate 5 y JPA 2.2 java.time.

¿Dónde obtener las clases java.time?

los ThreeTen-Extra el proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más.


ACTUALIZACIÓN: Esta sección «Joda-Time» a continuación se deja intacta como historial. los Joda-Time proyecto, ahora en modo de mantenimiento, aconseja la migración a la java.time clases.

Otras respuestas son correctas con respecto a las clases java.util.Date y java.util.Calendar incluidas. Pero esas clases son notoriamente problemáticas. Así que aquí hay un código de ejemplo usando el Joda-Time 2.3 biblioteca.

Si realmente desea una fecha sin ninguna parte horaria y sin zona horaria, utilice el LocalDate clase en Joda-Time. Esa clase proporciona métodos de comparación que incluyen compareTo (usado con Comparadores de Java), isBefore, isAfter, y isEqual.

Entradas …

String string1 = "22-02-2010";
String string2 = "07-04-2010";
String string3 = "25-12-2010";

Defina un formateador que describa las cadenas de entrada …

DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd-MM-yyyy" );

Utilice el 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 );

Volcar a la consola…

System.out.println( "Dates: " + localDate1 + " " + localDate2 + " " + localDate3 );
System.out.println( "is1After2 " + is1After2 );
System.out.println( "is2Before3 " + is2Before3 );

Cuando se ejecuta …

Dates: 2010-02-22 2010-04-07 2010-12-25
is1After2 false
is2Before3 true

Así que vea si el segundo está entre los otros dos (exclusivamente, lo que significa que no es igual a ninguno de los dos extremos) …

boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );

Si está trabajando con períodos de tiempo, sugiero explorar en Joda-Time las clases: Duración, Intervalo, y Período. Métodos como overlap y contains facilite las comparaciones.

Para las representaciones de texto, consulte el estándar ISO 8601:

  • duración
    Formato: PnYnMnDTnHnMnS
    Ejemplo: P3Y6M4DT12H30M5S
    (Significa «tres años, seis meses, cuatro días, doce horas, treinta minutos y cinco segundos»)
  • intervalo
    Formato: inicio / fin
    Ejemplo: 2007-03-01T13: 00: 00Z / 2008-05-11T15: 30: 00Z

Las clases de Joda-Time pueden trabajar con cadenas en ambos formatos, tanto de entrada (análisis) como de salida (generación de cadenas).

Joda-Time realiza comparaciones utilizando el Medio abierto enfoque donde el comienzo del tramo es inclusivo mientras el final es exclusivo. Este enfoque es sabio para manejar períodos de tiempo. Busque StackOverflow para obtener más información.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

XML – Comentarios

gfg 200x200 min

Convertir entero en cadena en Python