Blog de Eduardo Jiménez

26ago/0810

Clase para manejar java.sql.Time (sumar, restar, etc)

Me he decidido a crear  este post y a comprometerme a mejorar la clase que os presento para el uso de java.sql.Time

A veces tratar con horas es complicado, sobre todo cuando la hora la obtienes de una base de datos y en ocasiones esta hora se ha guardado con la famosa fecha "1970/01/01" o quizás se ha guardado con la fecha actual.

Cuando tienes que operar con estas Horas, te puedes encontrar con resultados no esperados, y es por esto por lo que os presento una clase que os puede ayudar.

Si tiene errores o encontrais alguna mejora por favor avisar.

---- FICHERO MyTime.java ----

import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

/**
*
* @author Eduardo Jiménez Peña
*/
public class MyTime {

public Time sumarTime(java.sql.Time hora1, java.sql.Time hora2) {
return operacionTime(hora1, hora2, "+");
}

public Time sumarTime(List<java.sql.Time> horas) {
long suma = 0;
for (java.sql.Time hora : horas) {
if (suma == 0) {
suma = hora.getTime();
} else {
suma = operacionMilisegundos(getMilisegundosToTime(suma), hora, "+");
}
}
return getMilisegundosToTime(suma);
}

public Time restarTime(java.sql.Time hora1, java.sql.Time hora2) {
return operacionTime(hora1, hora2, "-");
}

private Time operacionTime(java.sql.Time hora1, java.sql.Time hora2, String operacion) {
long lnMilisegundos = operacionMilisegundos(hora1, hora2, operacion);
return new java.sql.Time(lnMilisegundos);
}

private long operacionMilisegundos(java.sql.Time hora1, java.sql.Time hora2, String operacion) {
long time1 = getMilisegundosDesde1970(hora1);
long time2 = getMilisegundosDesde1970(hora2);

long timeTotal = 0;
if (operacion.equals("+")) {
timeTotal = time1 + time2;
} else if (operacion.equals("-")) {
timeTotal = time1 - time2;
}

java.util.Date utilDate = new java.util.Date("1970/01/01 " + milisegundosToStringHoras(timeTotal));
long lnMilisegundos = utilDate.getTime();
return lnMilisegundos;
}

private long getMilisegundosDesde1970(java.sql.Time hora) {
long returnAux = 0;

//creamos una fecha con la hora que nos pasan y fecha 1970/01/01
java.util.Date fecha = new java.util.Date("1970/01/01 " + hora.toString());

Calendar calendarIn = new GregorianCalendar();
calendarIn.setTime(fecha);
SimpleDateFormat sdf = new SimpleDateFormat();

sdf.applyPattern("HH");
calendarIn.set(Calendar.HOUR_OF_DAY, Integer.parseInt(sdf.format(fecha.getTime())));
sdf.applyPattern("mm");
calendarIn.set(Calendar.MINUTE, Integer.parseInt(sdf.format(fecha.getTime())));
sdf.applyPattern("ss");
calendarIn.set(Calendar.SECOND, Integer.parseInt(sdf.format(fecha.getTime())));

returnAux = calendarIn.getTimeInMillis();

// el java.sql.time hay que sumarle una hora
// ya que java.sql.Time t = new java.sql.Time(0) = 01:00:00
return returnAux + 3600000;
}

private Time getMilisegundosToTime(long milisegundos) {
return new java.sql.Time(milisegundos);
}

private String milisegundosToStringHoras(long milisegundos) {
String auxReturn;
double milisegundosAux = milisegundos;

Float horaD = new Float(milisegundosAux / 3600000);
int hora = Math.round(horaD);

Float restoHora = new Float(milisegundosAux % 3600000);

Float minutoD = restoHora / 60000;
int minuto = minutoD.intValue();

Float restoMinutos = restoHora % 60000;

Float segundosD = restoMinutos / 1000;
int segundos = segundosD.intValue();

auxReturn = hora + ":" + minuto + ":" + segundos;

return auxReturn;
}
}

---- FIN FICHERO MyTime.java ----

En cuanto pueda pongo un enlace para descargar el fichero, aunque lo podeis copiar y pegar tranquilamente.

Ahora os muestro un par de ejemplos de uso de la clase:

MyTime mt = new MyTime();

List<java.sql.Time> horasList = new ArrayList();

horasList.add(hora2);
horasList.add(hora2);
horasList.add(hora2);
System.out.print("3 x " + hora2 + " = ");
System.out.println(mt.sumarTime(horasList));

System.out.println("-----------");
System.out.print(hora1 + " + " + hora2 + " = ");
System.out.println(mt.sumarTime(hora1, hora2));

¡Si te ha gustado compartelo!

  • Print
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • BarraPunto
  • Bitacoras.com
  • email
  • LinkedIn
  • Meneame
  • MySpace
  • PDF
  • RSS
  • Technorati
  • Twitter

También te puede interesar:

¿Te gustó este artículo?

¡Suscríbete a nuestro feed RSS!

Comentarios (10) Trackbacks (0)
  1. podrías pasarme el proyecto completo?

    gracias

  2. Hola Mónica,

    claro, te lo he enviado al correo, es para NetBeans

    saludos

  3. HOLA, HOLA, OYE NECESITO UNO PERO NO ES PARA HORAS, ES PARA SABER LA EDAD DE LA PERSONA, QUE INGRESE SU FECHA DE NACIMIENTO Y QUE LE DIGA SU EDAD EN AÑOS, CON CUANTOS MESES Y CUANTOS DIAS TIENE. POR FA SI PUEDES AYDARME TE LO AGRADECERÉ UN BUEN GRAX:)

  4. Hola Mirtza…

    lo q comentas no es muy dificil…cuanto tengo un rato lo hago y te lo paso.

    Gracias, un saludo!

  5. Hola quiero saber que clase de java sirve para tomar el tiempo de cuanto dura una aplicacion ejecutandose???

  6. Buenas,

    Ya hace mucho que lo hiciste, pero te informo de que esta mal, o por lo menos a mi no me funcionaba bien.
    el int hora = Math.round(horaD); se me incrementaba una hora cada 2 minutos a partir de los 30 primeros minutos.
    poniendo el int hora = horaD.intValue(); te funcionara perfectamente, ya que el / te devuelve la parte entera y entonces no tienes q redondear

  7. Buenas….. ya se que es un poco tarde… pero es posible que a mi tambien me pasen el proyecto completo ??

  8. Hola Ivan,

    la verdad es que ahora mismo no lo tengo a mano… no se si te podremos echar una mano de otra forma?

  9. Hola puedes ayudar en rear un programa que me permita sumar 2 numeros sin utilizar el operador +(es como sumar en una calculadora sin utilizar el signo + )… xfis ayudame..

  10. jeje, parece el típico problema de alguna asignatura… si tienes algo hecho y no te funciona o algo, ponlo por aquí a ver si entre todos podemos echarte una mano ;-)


Leave a comment

(required)

Aún no hay trackbacks.