Este es el comienzo para mi blog

Mi día a día en el desarrolo de Software (JEE, Glassfish, JBoss EAP, Primefaces, Ajax, Android)

martes, 26 de abril de 2016

¿Cómo calcular el tiempo transcurrido entre dos horas en Java con JSF?

  Antecedente

 Este artículo lo escribo por petición de un lector (laura montoya) de mí post ¿Cómo calcular los meses entre dos fechas en Java? a la cual le agradezco por sugerir el tema.

Problema

En nuestro trabajo del día a día seguramente alguna vez nos hemos encontrado con el problema de calcular el tiempo transcurrido entre dos horas (horainicial:Date y horafinal:Date) y cuyo resultado lo debemos presentar en un tercer campo (tiempotranscurrido:Double) utilizando el Framework JSF.

Como hable en mi anterior post (¿Cómo sumar/restar días, meses o años a una fecha en Java?) es conocido para muchos desarrolladores Java que el trabajar con fechas (Date) es algo complicado.

Solución

Para calcular el tiempo transcurrido entre dos horas en Java debemos comprender como trabaja la clase Date de Java; es así que el manejo de horas en Java se lo hace a través de esta misma Clase, ya que esta almacena un instante específico en el tiempo, que incluye fecha y hora; así pues, un instante de tiempo puede ser el 10 de Agosto de 1810 a las 13:10:25.

Otro aspecto muy importante a considerar es la forma de cómo podemos realizar la resta de estos dos instantes de tiempo y almacenarlos en otra variable; para esto la clase Date de Java nos permite extraer el instante de tiempo almacenado en la variable mediante el método getTime(), este método devuelve una resultado de tipo long, y da el tiempo transcurrido, en milisegundos,  desde la fecha Enero 1 de 1970 a las 00:00:00 hasta la fecha con la que estamos trabajando; así pues obteniendo el valor de nuestros dos instantes de tiempo, horainicial y horafinal, podemos hacer la resta de estos dos con lo que obtendríamos el tiempo transcurrido entre estas dos variables, y lo podríamos guardar en una tercera variable.

Hasta el momento hemos conseguido restar los dos instantes de tiempo y almacenarlos en una tercera variable, lo que nos queda por hacer es interactuar con estas variables en el Front End y que el usuario final interactúe con el formulario. Esto lo hacemos con la ayuda del Framework JSF bajo la implementación PrimeFaces 5.0, el cual dicho sea de paso es parte del estándar de JEE. Como hable en mí post Ocultar/mostrar un componente JSF 2.0 en Primefaces 5.0 usando Ajax usaremos los conceptos del ciclo de vida de un componente JSF y adicionalmente los conceptos de eventos sobre los componentes JSF.

Implementación

Luego de haber analizado los problemas para calcular el tiempo transcurrido entre dos horas en Java, dejo el código de la implementación del algoritmo en lenguaje Java.

//3600000  es el valor en milisegundos de una hora.             
int tempresta = (int) (horafinal.getTime() - horainicial.getTime());
double tiempotranscurrido = Math.rint(((double) tempresta / 3600000) * 100) / 100;

Ahora bien, luego de tener ya el resultado del tiempo transcurrido entre las dos horas, trabajaremos en la capa de presentación utilizando la ayuda de un Backing Beean, el cual tiene las variables horainicial y horafinal, de tipo Date, y tiempotranscurrido, de tipo Double, estas variables interactuan mediate el método "seleccionHoras", el cual se ejecuta al momento de invocar al evento de cambio de valor de una variable, -campo en el formulario-, ya sea horainicial u horafinal, y lo almacena en la variable tiempotranscurrido para que finalmente, mediante ajax, este valor pueda ser mostrado en la página. Dejo el código fuente de la implementación.



Finalmente aquí está el componente xhtml.




Comparto unas imágenes de como se ve el resultado final.





Espero sea de utilidad. No olviden dejar sus comentarios.

viernes, 22 de abril de 2016

¿Cómo sumar/restar días, meses o años a una fecha en Java?

Problema

En nuestro trabajo del día a día seguramente que alguna vez nos hemos encontrado con el problema de sumar o restar un determinado número de meses a una fecha en el lenguaje Java, esto especialmente en el desarrollo de Sistemas de Información en los cuales el registro de fechas son un tema delicado de tratar. 

Como hable en mi anterior post (¿Cómo calcular los meses entre dos fechas en Java?) es conocido para muchos desarrolladores Java que el trabajar con fechas (Date) es algo complicado.

Solución

Para sumar/restar un determinado número de meses a una fecha en Java haremos uso de la clase Calendar de Java, la cual nos ayudará a realizar la suma/resta de meses a nuestra fecha con solo incluir unas pocas líneas de código.

La clase Calendar representa una fecha exacta en el tiempo, pero su principal característica es que esta sea mutable, es decir, permitir cambiar su valor sin generar un nuevo objeto (cosa que no permite Date). Para instanciar un objeto de tipo Calendar lo hacemos con su método getInstance(), el cual nos crea un objeto de la clase conteniendo la fecha de ese momento. Así es muy típico el uso: Calendar ahoramismo = Calendar.getInstance(). Del mismo modo, la clase Calendar nos permite modificar la fecha con la que es instanciada, para esto únicamente hacemos uso del metodo setTime(), su uso es el siguiente: ahoramismo.setTime(fechadeayer), donde fechadeayer debe estrictamente ser de tipo Date y representa la fecha que queremos que se almacene en nuestro objeto. Ahora bien para finalizar la suma/resta de un determinado número de meses a una fecha en Java, debemos conocer que la clase Calendar posee un  método que permite añadir (add) un determinado número de días (DAY_OF_MONTH), meses (MONTH) o años (YEAR) a nuestra fecha, esto se lo hace con la ayuda del método add; debiendole indicar al método, en sus argumentos, si deseamos que se lo haga a nivel de días, meses o años; y cuál es el número determinado que deseamos que se sume (el número debe estar en positivo ej. 3) o se reste (el número debería estar en negativo ej. -7).

Implementación

Luego de haber analizado los problemas para sumar/restar meses a una fecha en Java, pongo a disposición el código fuente  en lenguaje Java.

public static Calendar aniadirDias(Date fecha, int diasParaAniadir) {
        try {
            Calendar c1 = Calendar.getInstance();
            c1.setTime(fecha);
            System.out.println("--> " + c1.getTime());
            c1.add(Calendar.DAY_OF_MONTH, diasParaAniadir);
            System.out.println("--> + " + c1.getTime());
            return c1;
        } catch (Exception e) {
            return null;
        }
    }


Espero les haya ahorrado horas de investigación y de dolores de cabeza.
No olviden comentar el artículo.