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));
También te puede interesar:
¿Te gustó este artículo?
Aún no hay trackbacks.
27 agosto, 2008 - 00:14
podrías pasarme el proyecto completo?
gracias
27 agosto, 2008 - 16:01
Hola Mónica,
claro, te lo he enviado al correo, es para NetBeans
saludos
2 abril, 2009 - 01:15
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:)
2 abril, 2009 - 08:21
Hola Mirtza…
lo q comentas no es muy dificil…cuanto tengo un rato lo hago y te lo paso.
Gracias, un saludo!
16 mayo, 2009 - 07:51
Hola quiero saber que clase de java sirve para tomar el tiempo de cuanto dura una aplicacion ejecutandose???
25 noviembre, 2009 - 11:50
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
4 abril, 2011 - 19:58
Buenas….. ya se que es un poco tarde… pero es posible que a mi tambien me pasen el proyecto completo ??
4 abril, 2011 - 20:01
Hola Ivan,
la verdad es que ahora mismo no lo tengo a mano… no se si te podremos echar una mano de otra forma?
3 mayo, 2011 - 19:26
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..
3 mayo, 2011 - 19:31
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