2012-01-25 19 views
7

Deseo calcular la diferencia entre dos fecha/hora en Java usando las clases de fecha y calendario. El formato que tengo es "2012-01-24 12:30:00 PM".Calcular la diferencia de fecha/hora en Java considerando AM/PM

He implementado mi propio método y también google para trabajar con otros, pero no he recibido la pista correcta para manejar los valores de AM y PM.

La diferencia de fecha/hora tiene problemas siempre que el tiempo tiene 12 (AM/PM) en ella. Por ejemplo, si tengo la fecha/hora "2012-01-24 12:30:00 PM" y "2012-01-24 02:30:00 PM", muestra que la diferencia es de 10 horas.

Teniendo en cuenta el código en this link cómo se puede modificar para manejar AM y PM.

Para convertir la cadena de fecha en fecha utilizo siguiente código:

String sessionTimeStart = "2012-01-24 12:30:00 PM"; 
    String sessionTimerEndOrCurrent = "2012-01-24 02:30:00 PM"; 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

    Date d1 = null; 
    Date d0 = null; 
    try { 
     d1 = format.parse(sessionTimeStart); 
     d0 = format.parse(sessionTimerEndOrCurrent); 
    } catch (ParseException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
+0

¿Cómo convertir la cadena a un objeto 'Fecha'? ¿Y cómo calculas la diferencia? Si usa el código que ha vinculado, ¿cómo lo llama? – Thomas

+0

@Thomas He actualizado la publicación – rizzz86

Respuesta

6

El problema es su formato de fecha: en lugar de yyyy-MM-dd HH:mm:ss a use yyyy-MM-dd hh:mm:ss a.

HH será la hora en el día (0-23) mientras que hh será la hora en AM/PM (1-12). Por lo tanto, con su formato de fecha 02:30:00 se analizará simplemente como que en lugar de convertirse a la versión de PM (que en la hora del día sería 14:30:00).

+0

. Creo que tienes razón @Thomas. Intentaré cambiarlo a 'hh' y probaré todos mis casos. – rizzz86

1

No construya usted mismo, utilice una biblioteca establecida. Jodatime se usa ampliamente.

+0

Gracias por su sugerencia @his. Pero como mencioné, tengo que usar las clases de Fecha y Calendario. – rizzz86

1

onsider usando Apache Commons DateUtils DurationFormatUtils formatPeriod método hará la magia.

¡Buena suerte!

EDITAR Asumiendo que usted tiene una fecha y fecha inicializado en este punto b,

String format="HH:mm:ss.SSS"; // whatever you wish 
boolean padWithZeros=true; // whatever you wish 
TimeZone timezone=null; // whatever you wish 
long timeA = a.getTime(); 
long timeB = b.getTime(); 

String period = DurationFormatUtils.formatPeriod(timeB, timeA, format, padWithZeros, timezone); 
+0

Gracias por su sugerencia @aviad. Pero como mencioné, tengo que usar las clases de Fecha y Calendario. – rizzz86

+0

@ rizzz86, ver mi edición. – aviad

-1

calendario tiene un complemento méthode() que puede ser utilizado para sustraer también. Mira esto. Debería utilizar Calendar en lugar de Date de todos modos porque la mayoría de las operaciones de Date están en desuso.

+1

La pregunta fue sobre el cálculo de la diferencia no sobre la comparación. – aviad

+0

Lo siento, he entendido mal la API. El pensamiento compareTo() devolvería la diferencia en milisegundos. –

+0

Encontré otra solución. Quizás el correcto esta vez ;-) –

3

¿Tienes estas fechas como cadenas? Analizarlos con un SimpleDateFormat con la cadena de formato adecuado, y calcular la diferencia en horas:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Date d1 = df.parse("2012-01-24 12:30:00 PM"); 
Date d2 = df.parse("2012-01-24 02:30:00 PM"); 

int hoursDifference = (int)((d2.getTime() - d1.getTime())/3600000L); 
System.out.println("Difference in hours: " + hoursDifference); 

Su error es que está utilizando HH (horas 24 horas) en lugar de hh (12 horas al día horas) en su cadena de formato.

+0

Gracias @Jesper, voy a probar tu solución también. Pero el HH y el hh parecen ser el caso que me falta aquí. – rizzz86

4

El motivo por el que muestra 10 horas es que tiene un error en el patrón al analizar la entrada.

Aquí hay un ejemplo usando SimpleDateFormat:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a"); 

Date date1 = df.parse("2012-01-24 12:30:00 PM"); 
Date date2 = df.parse("2012-01-24 02:30:00 PM"); 

long differenceInHours = Math.abs(date1.getTime() - date2.getTime())/1000/60/60); 

Will volver 10.

Cuando acabamos de cambiar ligeramente el patrón de formato de fecha, utilizando hh para la hora en AM/PM (1-12) en lugar de HH por hora en días (0-23):

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a"); 

Devuelve (el esperado) 2.

Consulte el documentation for SimpleDateFormat para obtener sus patrones correctos.

Cuestiones relacionadas