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