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:
Etiquetas: 1970/01/02, Calendar, GregorianCalendar, Java, java.sql.Time, java.util.Date, SimpleDateFormat
Esta entrada fue escrita el Martes, Agosto 26th, 2008 a las 20:30 bajo la categoría Java. Puede seguir los comentarios de esta entrada a través del RSS 2.0 feed, dejar un comentario, o realizar un trackback desde su web.
podrías pasarme el proyecto completo?
gracias
Hola Mónica,
claro, te lo he enviado al correo, es para NetBeans
saludos
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:)
Hola Mirtza…
lo q comentas no es muy dificil…cuanto tengo un rato lo hago y te lo paso.
Gracias, un saludo!
Hola quiero saber que clase de java sirve para tomar el tiempo de cuanto dura una aplicacion ejecutandose???
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