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