Compara dos fechas en Java

Necesito comparar dos fechas en java. Estoy usando el código de esta manera:

Date questionDate = question.getStartDate(); Date today = new Date(); if(today.equals(questionDate)){ System.out.println("Both are equals"); } 

Esto no está funcionando. El contenido de las variables es el siguiente:

  • questionDate contiene 2010-06-30 00:31:40.0
  • today contiene Wed Jun 30 01:41:25 IST 2010

¿Cómo puedo resolver esto?

La igualdad de fecha depende de que las dos fechas sean iguales al milisegundo. La creación de un nuevo objeto Date utilizando una new Date() nunca será igual a una fecha creada en el pasado. Las API de Joda Time simplifican el trabajo con las fechas; sin embargo, usando solo el SDK de Java:

 if (removeTime(questionDate).equals(removeTime(today)) ... public Date removeTime(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } 

Yo usaría JodaTime para esto. Aquí hay un ejemplo: digamos que quiere encontrar la diferencia en días entre 2 fechas.

 DateTime startDate = new DateTime(some_date); DateTime endDate = new DateTime(); //current date Days diff = Days.daysBetween(startDate, endDate); System.out.println(diff.getDays()); 

JodaTime se puede descargar desde aquí .

No es claro para mí lo que quiere, pero mencionaré que la clase Date también tiene un método compareTo , que se puede usar para determinar con una llamada si dos objetos Date son iguales o (si no son iguales) lo que ocurre cuanto antes. Esto le permite hacer algo como:

 switch (today.compareTo(questionDate)) { case -1: System.out.println("today is sooner than questionDate"); break; case 0: System.out.println("today and questionDate are equal"); break; case 1: System.out.println("today is later than questionDate"); break; default: System.out.println("Invalid results from date comparison"); break; } 

Cabe señalar que los documentos de la API no garantizan que los resultados sean -1, 0 y 1, por lo que es posible que desee utilizar if-elses en lugar de un cambio en cualquier código de producción. Además, si la segunda fecha es nula, obtendrá una NullPointerException, por lo que puede ser útil envolver su código en un try-catch.

La forma más fácil de comparar dos fechas es convirtiéndolas en valor numérico (como la marca de tiempo de unix).

Puede usar el método Date.getTime() que devuelve la hora de Unix.

 Date questionDate = question.getStartDate(); Date today = new Date(); if((today.getTime() == questionDate.getTime())) { System.out.println("Both are equals"); } 

es esy usando time.compareTo(currentTime) < 0

 import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class MyTimerTask { static Timer singleTask = new Timer(); @SuppressWarnings("deprecation") public static void main(String args[]) { // set download schedule time Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 9); calendar.set(Calendar.MINUTE, 54); calendar.set(Calendar.SECOND, 0); Date time = (Date) calendar.getTime(); // get current time Date currentTime = new Date(); // if current time> time schedule set for next day if (time.compareTo(currentTime) < 0) { time.setDate(time.getDate() + 1); } else { // do nothing } singleTask.schedule(new TimerTask() { @Override public void run() { System.out.println("timer task is runing"); } }, time); } } 

java.time

En Java 8 no es necesario utilizar Joda-Time, ya que viene con una nueva API similar en el paquete java.time . Use la clase LocalDate .

 LocalDate date = LocalDate.of(2014, 3, 18); LocalDate today = LocalDate.now(); Boolean isToday = date.isEqual( today ); 

Puede solicitar el intervalo de tiempo entre las fechas con la clase Period .

 Period difference = Period.between(date, today); 

LocalDate es comparable usando equals y compareTo ya que no contiene información sobre el tiempo y la zona horaria.


Acerca de java.time

El marco java.time está integrado en Java 8 y posterior. Estas clases suplantan a las problemáticas antiguas clases heredadas 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 busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .

¿Dónde obtener las clases de java.time?

  • Java SE 8 , Java SE 9 y posterior
    • Incorporado.
    • Parte de la API Java estándar con una implementación integrada.
    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7
    • Gran parte de la funcionalidad de java.time se transfiere a Java 6 y 7 en ThreeTen-Backport .
  • Androide
    • Versiones posteriores de las implementaciones del paquete de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP adapta ThreeTen-Backport (mencionado anteriormente). Consulte Cómo utilizar ThreeTenABP ….

El proyecto ThreeTen-Extra amplía 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 más .

Lo siguiente será verdadero si dos variables de calendario tienen el mismo día del año.

  public boolean isSameDay(Calendar c1, Calendar c2){ final int DAY=1000*60*60*24; return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY)); } // end isSameDay 

Aquí hay otra respuesta: debe formatear las fechas de remolque para que quepan en la misma fuente para poder compararlas como una cuerda.

  Date questionDate = question.getStartDate(); Date today = new Date(); SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd"); String questionDateStr = dateFormatter.format(questionDate); String todayStr = dateFormatter.format(today); if(questionDateStr.equals(todayStr)) { System.out.println("Both are equals"); } 
 public static double periodOfTimeInMillis(Date date1, Date date2) { return (date2.getTime() - date1.getTime()); } public static double periodOfTimeInSec(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / 1000; } public static double periodOfTimeInMin(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / (60 * 1000); } public static double periodOfTimeInHours(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000); } public static double periodOfTimeInDays(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L); } 
 public long compareDates(Date exp, Date today){ long b = (exp.getTime()-86400000)/86400000; long c = (today.getTime()-86400000)/86400000; return bc; } 

Esto funciona para GregorianDates. 86400000 son la cantidad de milisegundos en un día, esto devolverá el número de días entre las dos fechas.

Esta es una publicación muy antigua a pesar de compartir mi trabajo. Aquí hay un pequeño truco para hacerlo

 DateTime dtStart = new DateTime(Dateforcomparision); DateTime dtNow = new DateTime(); //current date if(dtStart.getMillis() < = dtNow.getMillis()) { //to do } 

utilice el comparador según su requisito

en mi caso, solo tenía que hacer algo como esto:

 date1.toString().equals(date2.toString()) 

¡Y funcionó!

Funciona mejor …

 Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); 

Esto es lo que puede hacer para decir la comparación aaaa-mm-dd:

 GregorianCalendar gc= new GregorianCalendar(); gc.setTimeInMillis(System.currentTimeMillis()); gc.roll(GregorianCalendar.DAY_OF_MONTH, true); Date d1 = new Date(); Date d2 = gc.getTime(); SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd"); if(sf.format(d2).hashCode() < sf.format(d1).hashCode()) { System.out.println("date 2 is less than date 1"); } else { System.out.println("date 2 is equal or greater than date 1"); }