studio - ¿Cómo comparar fechas en Java?
comparar rango de fechas en java (11)
Actualización para Java 8 y versiones posteriores.
Estos métodos existen en las LocalDate
, LocalTime
y LocalDateTime
.
Esas clases están integradas en Java 8 y versiones posteriores. Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport y se adapta aún más a Android en ThreeTenABP (consulte Cómo usar ... ).
Esta pregunta ya tiene una respuesta aquí:
¿Cómo comparo las fechas intermedias en Java?
Ejemplo:
fecha1 es 22-02-2010
date2 es 07-04-2010
hoy
fecha3 es 25-12-2010
date3
es siempre mayor que date1
y date2
es siempre hoy. ¿Cómo verifico si la fecha de hoy está entre la fecha 1 y la fecha 3?
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 la biblioteca ThreeTen-Extra a su proyecto.
LocalDateRange.of(
LocalDate.of( … ) ,
LocalDate.of( … )
).contains(
LocalDate.now()
)
Enfoque semiabierto, donde principio es inclusivo y final es exclusivo .
Mala elección de formato
Por cierto, esa es una mala elección de formato para una representación de texto de una fecha o valor de fecha y hora. Siempre que sea posible, apéguese a 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 solo fecha, el formato estándar es YYYY-MM-DD. Tenga en cuenta que este formato tiene la ventaja de ser cronológico cuando se clasifica alfabéticamente.
LocalDate
La clase LocalDate
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 alrededor del mundo por zona. Por ejemplo, unos pocos minutos después de la medianoche en París, Francia es un nuevo día, mientras que todavía es "ayer" en Montreal Quebec .
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
DateTimeFormatter
Como las cadenas de entrada no tienen un formato estándar, debemos definir un patrón de formato para que coincida.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu" );
Usa eso 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, por lo general, es mejor definir un intervalo de tiempo en el enfoque semiabierto, donde el comienzo es inclusivo, mientras que el final es exclusivo . Así que queremos saber si hoy es el mismo o posterior al comienzo y también antes de la parada. Una forma más breve de decir "es lo mismo o más tarde que el comienzo" es "no antes del comienzo".
Boolean intervalContainsToday = ( ! today.isBefore( start ) ) && today.isBefore( stop ) ;
Consulte la Respuesta por g que muestra la lista de métodos de comparación a los que puede llamar.
Acerca de java.time
El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date
, Calendar
y SimpleDateFormat
.
El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busca para muchos ejemplos y explicaciones. La especificación es JSR-310 .
¿Dónde obtener las clases java.time?
- Java SE 8 y SE 9 y posteriores
- Incorporado.
- Parte de la API de Java estándar con una implementación en paquete.
- Java 9 agrega algunas características menores y correcciones.
- Java SE 6 y SE 7
- Gran parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
- Android
- El proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente) para Android específicamente.
- Vea Cómo usar ThreeTenABP… .
El proyecto ThreeTen-Extra extiende 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 de "Tiempo Joda" a continuación se deja intacta como historia. El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Tiempo de joda
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 la biblioteca Joda-Time 2.3.
Si realmente desea una fecha sin ninguna porción de tiempo ni zona horaria, use la clase LocalDate
en Joda-Time. Esa clase proporciona métodos de comparación que incluyen compareTo
(utilizado con los 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" );
Use 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 puntos finales) ...
boolean is2Between1And3 = ( ( localDate2.isAfter( localDate1 ) ) && ( localDate2.isBefore( localDate3 ) ) );
Trabajando con intervalos de tiempo
Si está trabajando con Interval de tiempo, sugiero explorar en Joda-Time las clases: Duration , Interval y Period . Métodos como la overlap
y el contains
facilitan las comparaciones.
Para representaciones de texto, mire la norma ISO 8601:
- duration
Formato: PnYnMnDTnHnMnS
Ejemplo: P3Y6M4DT12H30M5S
(Significa "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 de Joda-Time pueden trabajar con cadenas en ambos formatos, tanto como entrada (análisis) como salida (generación de cadenas).
Joda-Time realiza comparaciones utilizando el enfoque semiabierto en el que el principio del intervalo es inclusivo, mientras que el final es exclusivo . Este enfoque es sabio para manejar lapsos de tiempo. Buscar para más información.
Compara las dos fechas:
Date today = new Date();
Date myDate = new Date(today.getYear(),today.getMonth()-1,today.getDay());
System.out.println("My Date is"+myDate);
System.out.println("Today Date is"+today);
if (today.compareTo(myDate)<0)
System.out.println("Today Date is Lesser than my Date");
else if (today.compareTo(myDate)>0)
System.out.println("Today Date is Greater than my date");
else
System.out.println("Both Dates are equal");
Este método funcionó para mi:
public static String daysBetween(String day1, String day2) {
String daysBetween = "";
SimpleDateFormat myFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
Date date1 = myFormat.parse(day1);
Date date2 = myFormat.parse(day2);
long diff = date2.getTime() - date1.getTime();
daysBetween = ""+(TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
} catch (ParseException e) {
e.printStackTrace();
}
return daysBetween;
}
La determinación de este código de hoy es de cierta duración ... según la configuración regional de COREA
Calendar cstart = Calendar.getInstance(Locale.KOREA);
cstart.clear();
cstart.set(startyear, startmonth, startday);
Calendar cend = Calendar.getInstance(Locale.KOREA);
cend.clear();
cend.set(endyear, endmonth, endday);
Calendar c = Calendar.getInstance(Locale.KOREA);
if(c.after(cstart) && c.before(cend)) {
// today is in startyear/startmonth/startday ~ endyear/endmonth/endday
}
Las siguientes son las formas más comunes de comparar fechas. Pero yo prefiero el primero
Enfoque-1: uso de Date.before (), Date.after () y Date.equals ()
if(date1.after(date2)){
System.out.println("Date1 is after Date2");
}
if(date1.before(date2)){
System.out.println("Date1 is before Date2");
}
if(date1.equals(date2)){
System.out.println("Date1 is equal Date2");
}
Enfoque-2: Date.compareTo ()
if(date1.compareTo(date2)>0){
System.out.println("Date1 is after Date2");
}else if(date1.compareTo(date2)<0){
System.out.println("Date1 is before Date2");
}else{
System.out.println("Date1 is equal to Date2");
}
Enfoque-3: Calender.before (), Calender.after () y Calender.equals ()
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
if(cal1.after(cal2)){
System.out.println("Date1 is after Date2");
}
if(cal1.before(cal2)){
System.out.println("Date1 is before Date2");
}
if(cal1.equals(cal2)){
System.out.println("Date1 is equal Date2");
}
Prueba esto
public static boolean compareDates(String psDate1, String psDate2) throws ParseException{
SimpleDateFormat dateFormat = new SimpleDateFormat ("dd/MM/yyyy");
Date date1 = dateFormat.parse(psDate1);
Date date2 = dateFormat.parse(psDate2);
if(date2.after(date1)) {
return true;
} else {
return false;
}
}
Puedes usar Date.getTime()
que:
Devuelve el número de milisegundos desde el 1 de enero de 1970, 00:00:00 GMT representado por este objeto Fecha.
Esto significa que puedes compararlos como números:
if (date1.getTime() <= date.getTime() && date.getTime() <= date2.getTime()) {
/*
* date is between date1 and date2 (both inclusive)
*/
}
/*
* when date1 = 2015-01-01 and date2 = 2015-01-10 then
* returns true for:
* 2015-01-01
* 2015-01-01 00:00:01
* 2015-01-02
* 2015-01-10
* returns false for:
* 2014-12-31 23:59:59
* 2015-01-10 00:00:01
*
* if one or both dates are exclusive then change <= to <
*/
Use getTime () para obtener el valor numérico de la fecha y luego compare usando los valores devueltos.
Utilice compareTo :
date1.compareTo(date2);
Date tiene métodos before y after y puede compararse entre sí de la siguiente manera:
if(todayDate.after(historyDate) && todayDate.before(futureDate)) {
// In between
}
Para una comparación inclusiva:
if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) {
/* historyDate <= todayDate <= futureDate */
}
También puedes darle una oportunidad a Joda-Time , pero ten en cuenta que:
Joda-Time es la biblioteca de fecha y hora estándar de facto para Java anterior a Java SE 8. Ahora se solicita a los usuarios que migren a java.time ( JSR-310 ).
Los puertos posteriores están disponibles para Java 6 y 7, así como para Android.