GWT – Calcular fecha en el cliente

agosto 30, 2010

Update: Puedes utilizar la clase DateUtil de SmartGWT para calcular fechas del lado del cliente.

Para mostrar una alerta de acuerdo al tiempo que había pasado, necesitaba hacer un calculo simple; si la fecha actual es mayor -por treinta días- a mi fecha de referencia, entonces debía mostrarla.
Tenía 2 problemas, obtener la fecha actual y sumar 30 días a una fecha.
Para obtener la fecha actual

Date today=new Date();

solo que nos incluye la hora actual y a la hora de comparar se puede volver una pesadilla, para remover la información de la hora

Date time=new Date();
Date today=new Date(time.getYear(),time.getMonth(),time.getDate());

Utilizamos métodos obsoletos, pero bueno, funciona.

El mayor problema viene cuando intentamos hacer calculos con fechas, como sumar días.
Dada la definición de las fechas en GWT/javascript como

All dates are calculated in milliseconds from 01 January, 1970 00:00:00
Universal Time (UTC) with a day containing 86,400,000 milliseconds.

w3schools
Podríamos hacerlo mediante la siguiente función

public Date addDays(Date date,int days){
return new Date(date.getTime()+days*1000*60*60*24);
}

Genial! lamentablemente no funciona, a mi no me arrojó ningún error, simplemente los calculos estaban mal. No se cual sea el problema, supongo que se debe a que el método Date.getTime() regresa un tipo de dato “long” y de acuerdo a la guía de GWT, este tipo de dato no se puede pasar de Java/GWT a javascript ni cómo parámetro ni como valor de retorno.
La única forma que encontré de hacer este cálculo fue mediante JSNI pasando los valores de tipo long como double, como lo hace la clase DateUtil de Gwt-Ext.

public static class DateUtils{

		protected DateUtils() {
		}

		public static Date createDate(double time){
			return new Date((long) time);
		}
		public static double getTime(Date date){
			return date.getTime();
		}

		public static native Date currentDate()/*-{
			var time=new $wnd.Date();
			var today=new $wnd.Date(time.getFullYear(),time.getMonth(),time.getDate(),0,0,0,0);
			return @package.DateUtils::createDate(D)(today.getTime());
		}-*/;

		public static native Date addDays(Date date,int days)/*-{
			var millis=@package.DateUtils::getTime(Ljava/util/Date;)(date);
			var jsDate= new $wnd.Date(millis+days*1000*60*60*24);
			return @package.DateUtils::createDate(D)(jsDate.getTime());
		}-*/;

	}

Fuentes:
Coding Basics – JavaScript Native Interface (JSNI)
GwtExt DateUtil source code
w3schools – JavaScript Date
SmartGwt Forum
blog.gerardin.info – GWT and Javascript Date Hell

Anuncios

2 comentarios to “GWT – Calcular fecha en el cliente”

  1. Jero Says:

    Gracias!!! muchas gracias por publicar el codigo me fue de mucha ayuda!!!
    Abrazo desde Argentina, Buenos Aires.-


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: