2011-10-06 18 views
27

¿Cuál es un buen método para, dado dos objetos de fecha, comparar la diferencia entre su porción de tiempo solamente, ignorando por completo año, mes y día?Compara solo la parte de tiempo de dos fechas, ignorando la parte de fecha

Es todo lo contrario de this question.

ACTUALIZACIÓN: Aquí está el código final para referencia futura:

private long differenceBetween(Date currentTime, Date timeToRun) 
{ 
    Calendar currentCal = Calendar.getInstance(); 
    currentCal.setTime(currentTime); 

    Calendar runCal = Calendar.getInstance(); 
    runCal.setTime(timeToRun); 
    runCal.set(Calendar.DAY_OF_MONTH, currentCal.get(Calendar.DAY_OF_MONTH)); 
    runCal.set(Calendar.MONTH, currentCal.get(Calendar.MONTH)); 
    runCal.set(Calendar.YEAR, currentCal.get(Calendar.YEAR)); 

    return currentCal.getTimeInMillis() - runCal.getTimeInMillis(); 
} 
+2

Sí, lo hace. ¿Por qué no? – kolrie

+0

La ironía de esta solución es que tomas dos objetos que son envoltorios delgados alrededor de una primitiva de tipo largo, invocan una API masiva y compleja para convertir objetos largos en objetos de calendario ... solo para terminar en un lugar donde estás ' volver a convertir objetos de Calendar en longs nuevamente. – scottb

+0

@scottb - Ver [mi respuesta] (http://stackoverflow.com/questions/7676149#7676307) a continuación, que no se mezcla con los objetos 'Calendar', sino que usa solo los miembros' Date'. –

Respuesta

29

Si desea comparar los valores subyacentes binarios (long int) de las fechas, puede hacer esto:

public int compareTimes(Date d1, Date d2) 
{ 
    int  t1; 
    int  t2; 

    t1 = (int) (d1.getTime() % (24*60*60*1000L)); 
    t2 = (int) (d2.getTime() % (24*60*60*1000L)); 
    return (t1 - t2); 
} 

Adición 1

Esta técnica tiene la ventaja de la velocidad, ya que utiliza el valor subyacente long de los objetos Date directamente, en lugar de convertir componentes y calendario (lo que es bastante caro y lento). También es mucho más simple que jugar con los objetos Calendar.

Addendum 2

El código anterior devuelve la diferencia de tiempo como un int, que será correcta para cualquier par de veces, ya que ignora las porciones de año/mes/día de la fecha por completo, y el la diferencia entre dos veces cualquiera es no más de 86,400,000   ms (=   1000 ms/seg × 60 seg/min × 60 min/hora × 24 h/día).

+0

Esta es la mejor respuesta, imo. No es necesario utilizar una API de calendario compleja para comparar valores de tiempo dentro de los objetos de fecha. – scottb

+0

esto es perfecto e inteligente –

+0

thnx david, exactamente lo que estaba buscando :) –

5

Tome un vistazo a la clase Calendar. Tiene soporte para extraer horas, minutos y segundos de Date.

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(yourDateObject); 
int hour = calendar.get(Calendar.HOUR); 
int minute = calendar.get(Calendar.MINUTE); 
int second = calendar.get(Calendar.SECOND); 
+0

Calendar.HOUR_OF_DAY es más apropiado (24 horas en lugar de 12) – IHeartAndroid

1

En caso de no poder utilizar JODA,

crear 2 objetos de calendario, ajustar el año, mes y día a 0.

Compárelos ....

19

Usted puede considere utilizar el tiempo de Joda DateTimeComparator.getTimeOnlyInstance() para un comparador que comparará dos fechas de Joda basadas solo en los tiempos.

Por ejemplo:

DateTimeComparator comparator = DateTimeComparator.getTimeOnlyInstance(); 
comparator.compare(date1, date2); 

Ver http://joda-time.sourceforge.net/api-release/org/joda/time/DateTimeComparator.html#getTimeOnlyInstance()

+0

Si (java) time es la pregunta, JODA es la respuesta: D – bbaja42

+0

@ bbaja42 No es usted el que usa GWT:/ – displayname

1

Si JODA no es una opción, uno de los métodos más cortos es probablemente convertir el tiempo en cadenas y luego compararlas.

DateFormat df = new SimpleDateFormat("HHmmssSZ"); 
df.format(date1).equals(df.format(date2)); 
0

no saben lo bien practicada o eficiente es este, pero he escrito una función simple de utilizar el objeto Fecha que sirve a mis propósitos. Devuelve un verdadero o falso es el primer valor de fecha más grande que el segundo. Las entradas d1 & & d2 son objetos Date.

function CompareTimes(d1, d2) { 
      if (d1.getHours() < d2.getHours()) { 
       return false; 
      } 
      if (d1.getHours() > d2.getHours()) { 
       return true; 

      } else { 
       return (d1.getMinutes() > d2.getMinutes()); 
      } 
}; 
0

si sólo quiere comparar el tiempo parte de las fechas a continuación, esto le daría el resultado correcto -

public long compareTimes(Date d1, Date d2) 
    { 
     long  t1; 
     long  t2; 
     t1 = d1.getHours()*60*60+d1.getMinutes()*60+d1.getSeconds(); 
     t2 = d2.getHours()*60*60+d2.getMinutes()*60+d2.getSeconds(); 
     long diff = t1-t2; 
     System.out.println("t1 - "+t1+", t2 - "+t2+", diff - "+diff); 

     return diff; 
    } 
Cuestiones relacionadas