2010-06-29 72 views
25

Necesito comparar dos fechas en java. Estoy usando el código como este:Comparar dos fechas en Java

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 la 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?

Respuesta

41

La igualdad de fecha depende de que las dos fechas sean iguales al milisegundo. Crear un nuevo objeto Date usando 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 el SDK de Java solo:

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

Es posible que necesite ajustar la zona horaria también. –

+0

Las zonas horarias son una razón más para usar Joda Time =) –

+0

Gracias Eric. Está funcionando bien. Tengo una pregunta sobre esto. En lugar de escribir el método para eliminar el tiempo, ¿podemos usar el Dateformat? aclare –

13

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

+0

sí, necesito obtener 1 semana antes de fecha de inicio ... gracias –

9

No tengo claro 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 lo son) igual) que ocurre 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 si-vigilara en lugar de un interruptor 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.

-1

Esto es lo que puede hacer por ejemplo 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"); 
} 
1

El siguiente devolverá verdadero si dos variables tienen el mismo calendario los días 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 
4

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

Puede usar Date.getTime() método 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"); 
} 
+1

Es cierto, pero eso es esencialmente lo que 'igual()' ya hace. Además, no creo que esto responda la pregunta original. Parece que estaban tratando de comparar la * fecha * e ignorar cualquier porción de tiempo. Usar '==' no hará eso. – Leigh

+0

Tienes razón. Publiqué otra respuesta [link] (http://stackoverflow.com/questions/3144387/compare-two-dates-in-java/13870774#13870774) – Jamal

+0

No hay necesidad de publicar otra respuesta, solo [actualizar ésta] (http : //stackoverflow.com/posts/13853528/edit). – Leigh

0

Aquí es una otra respuesta: Es necesario formatear fechas del remolque para ajustarse a la misma fromat para poder compararlos como cadena.

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

Puede que quiera leer las sugerencias anteriores antes de publicar [Krolique ya sugirió que en 2010] (http://stackoverflow.com/a/4196253/104223) ;-) Personalmente prefiero [la sugerencia de Eric] (http: // stackoverflow .com/a/3144444/104223). Las cadenas y la lógica de fecha no mezclan IMO. – Leigh

3

se esy utilizando 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); 

    } 

} 
0
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); 
} 
0
public long compareDates(Date exp, Date today){ 

     long b = (exp.getTime()-86400000)/86400000; 
     long c = (today.getTime()-86400000)/86400000; 
     return b-c; 
    } 

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 .

0

Esta es una publicación muy antigua aunque comparto 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 
} 

uso comparador como por su exigencia

0

en mi caso, yo sólo tenía que hacer algo como esto:

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

Y funcionó!

2

java.time

En Java 8 no hay necesidad de usar 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 lapso de tiempo entre las fechas con Period clase.

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

LocalDate es comparable usando equals y compareTo, ya que posee ninguna información sobre hora y la zona horaria.


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 de 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, Java 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 Java SE 7
    • Gran parte de la funcionalidad de back-java.time está portado a Java 6 & 7 en ThreeTen-Backport.
  • Android
    • Las versiones posteriores de las implementaciones de haces de Android de las clases java.time.
    • Para Android anterior, el proyecto ThreeTenABP se adapta a ThreeTen-Backport (mencionado anteriormente). Ver How to use ThreeTenABP….

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.

+1

Buena respuesta pero sugiero pasar siempre la zona horaria opcional al método 'now'. Si se omite, depende implícitamente de la zona horaria predeterminada actual de la JVM. Ese valor predeterminado puede cambiar * en cualquier momento *, incluso durante la ejecución de su código (!). Es mejor especificar el huso horario esperado/deseado. 'LocalDate.now (ZoneId.of (" America/Montreal "))' –

0

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

FYI: La clase 'Calendar' es parte de las viejas clases problemáticas de fecha y hora que ahora son heredadas, suplantadas por las clases java.time. –