2010-04-07 23 views
299

¿Cómo comparo las fechas en Java?¿Cómo comparar fechas en Java?

Ejemplo:

fecha1 es 22-02-2010
la fecha 2 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 es entre date1 y date 3?

Respuesta

473

Date tiene before y after métodos y pueden ser compared to each other de la siguiente manera:

if(todayDate.after(historyDate) && todayDate.before(futureDate)) { 
    // In between 
} 

Para una comparación incluyente:

if(!historyDate.after(todayDate) && !futureDate.before(todayDate)) { 
    /* historyDate <= todayDate <= futureDate */ 
} 

También podría dar Joda-Time un ir, pero tenga en cuenta que:

Joda-Time es el de facto biblioteca de fecha y hora estándar para Java anterior a Java SE 8. Ahora se solicita a los usuarios migrar al java.time (JSR-310).

Back-ports están disponibles para Java 6 y 7, así como para Android.

+3

Es esto inclusive, o exclusivo para las fronteras? –

+1

@ DanielHári no es inclusivo. puede usar la solución sugerida en el primer comentario o usar CompareTo()> = 0. – Mifmif

+0

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. –

109

Uso compareTo:

date1.compareTo(date2);

+0

Funciona perfecto con Fecha, Byte, Largo, Entero ... –

20

Comparar 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"); 
+6

Creo que "nueva Fecha (today.getYear(), today.getMonth() -1, today.getDay()); " está desaprobado. http://download.oracle.com/javase/6/docs/api/java/util/Date.html –

+0

@Muath: aunque no estoy 100% seguro, creo que es porque el componente del mes en 'Fecha' es cero-indexado. – Lii

+0

creo que en la parte más no está funcionando :) – SMW

5

Uso GetTime() para obtener el valor numérico de la fecha, y luego comparar con los valores devueltos.

0

Este código determinan hoy en día es en cierta duración .. basado en KOREA local

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 
    } 
78

A continuación se forma más común de la comparación de fechas. Pero tengo prefieren 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"); 
      } 

Approach-3: Calender.before(), Calender.after() y calandria.es igual a()

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"); 
      } 
+0

FYI, las viejas clases problemáticas de fecha y hora como ['java.util.Date'] (https://docs.oracle.com/javase/9/docs/ api/java/util/Date.html), ['java.util.Calendar'] (https://docs.oracle.com/javase/9/docs/api/java/util/Calendar.html) y' java.text.SimpleDateFormat' ahora son [legacy] (https://en.wikipedia.org/wiki/Legacy_system), suplantado por [java.time] (https://docs.oracle.com/javase/9/ docs/api/java/time/package-summary.html) clases integradas en Java 8 y Java 9. Consulte [* Tutorial * de Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC. html). –

20

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.

10

Puede utilizar Date.getTime() cuales:

Devuelve el número de milisegundos desde el 1 de enero de 1970 00:00:00 GMT representado por este objeto Date.

Esto significa que usted puede compararlos al igual que los 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 < 
*/ 
15

actualización para Java 8 y posterior

Estos métodos existe en LocalDate, LocalTime, y LocalDateTime clases.

Estas clases están integradas en Java 8 y posterior. Gran parte de la funcionalidad de java.time se transfiere a Java 6 & 7 en ThreeTen-Backport y se adapta a Android en ThreeTenABP (ver How to use…).

+0

cómo descargar estas tres clases – Punithapriya

+1

@Punithapriya Estas clases existen en la biblioteca java 8 standart. Por lo tanto, simplemente descargue java 8 – gstackoverflow

+0

sí, lo he visto gracias – Punithapriya

3

probar este

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; 
     } 
    } 
0

Este método funcionó para mí:

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; 
} 
+0

No responde la pregunta.La pregunta involucra * tres * fechas, no dos. "¿Cómo verifico si la fecha de hoy está entre la fecha 1 y la fecha 3?" Además, este cálculo devuelve el número de períodos de 24 horas, no el número de días calendario transcurridos. Otro problema más: esta respuesta usa valores de fecha y hora, mientras que la pregunta se trata de valores solo de fecha sin hora del día. –