Calcular la diferencia de fecha / hora en Java considerando AM / PM

Quiero 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”.

Implementé mi propio método y también lo busqué en Google para trabajar con otros, pero no recibí la pista correcta para manejar los valores de AM y PM.

La diferencia de fecha / hora tiene problemas siempre que el tiempo tenga 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 este enlace, ¿cómo se puede modificar para manejar AM y PM?

Para convertir la fecha de Cadena en Fecha, uso el 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(); } 

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 del 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 eso, en lugar de convertirse a la versión PM (que en la hora del día sería 14:30:00).

La razón por la que muestra 10 horas como diferencia 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); 

Volveremos 10 .

Cuando cambiamos ligeramente el patrón de formato de fecha, usando hh para la hora en am / pm (1-12) en lugar de HH para la hora en día (0-23):

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

Vuelve (lo esperado) 2 .

Consulte la documentación de SimpleDateFormat para obtener los patrones correctos.

Entonces, ¿tienes estas fechas como cadenas? SimpleDateFormat con un SimpleDateFormat con la cadena de formato apropiada, y calcule 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 de 24 horas) en lugar de hh (horas de 12 horas) en su cadena de formato.

No lo construyas tú mismo, utiliza una biblioteca establecida. Jodatime se utiliza ampliamente.

onsider usando el método Period de DateDtils DateUtils DurationFormatUtils format hará la magia.

¡Buena suerte!

EDITAR Asumiendo que tiene Fecha a y Fecha b inicializadas en este punto,

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

Calendar tiene un método add () que también se puede usar para restar. Mira esto. Debería usar el Calendario en lugar de la Fecha de todas formas porque la mayoría de las operaciones de la Fecha están en desuso.

Intereting Posts