DateTimes…

Mas de una vez han estado enfrentados al manejo de fechas en la realizacion de sistemas. Normalmente usamos tipos de datos que nos ayuden a darle significado a las propiedades o campós de nuestras clases o bien para representar de manera mas cercana las entidades que deseemos representar en nuestros sistemas.

Para esto entonces acudimos al tipo de dato DateTime, que nos permite tener una representacion de la fecha en un formato correcto y libre de errores. Sin embargo el hecho de utilizar este tipo de datos muchas veces hace que tengamos problemas a nivel de la configuracion del equipo del cliente que use la aplicacion, me refiero al siguiente caso:

Caso

Tenemos en nuestra base de datos SQL Server 2005 una tabla que maneja DateTimes.

Esta tabla guarda solamente informacion de fecha, sin guardar la hora, de hecho puede estar definida como smalldatetime. Sin embargo por defecto la base de datos guarda la fecha con la hora 12:00 AM.

Tenemos un servicio Web que se encarga de traer informacion de esa tabla de la base de datos. El servicio solo trae un DataSet que es el resultado de una consulta sobre la base de datos. Este DataSet infiere la estructura de los datos de la base de datos, teniendo dentro de su estructura el campo con el tipo de dato DateTime.

Problema

El servidor de base de datos y el del servicio Web estan en zona horaria GTM -5. Sin embargo la maquina del cliente puede estar configurada en otra zona horaria. Esta configuracion de Fecha y Hora no esta en las manos del desarrollador. Luego supongamos que la maquina esta en GTM -8.

Este sutil cambio en la configuracion de la maquina hace que cuando consumimos el servicio al traer los datos estos vengan con -1 dia de la fecha que se guardo en el sistema y que incluso se ve en SQL Server si uno consulta directamente la tabla. Esto porque al guardar los datos de fecha sin hora, esta se guarda con hora 12:00 AM lo cual al momento que llega al equipo del cliente, el DateTime se adapta a la zona horaria del equipo, lo que hace restar dos horas, asi entonces, si en la base de datos se tenia guardarda la fecha: 10/10/2007 12:00 AM, al consultarla a través del Web Service se visualizara como: 09/10/2007 10:00 PM. Seguramente como el sistema no muestra la hora guardada, pues solo guarda fechas, aparecera como si restara un dia a la fecha almacenada.

Solucion

Para esto debemos asegurar entonces que lo que se guardo es lo que se debe mostrar. (Esto en caso de que el modelo de negocio asi lo requiera. En muchos casos el negocio requiere que efectivamente se permitan este tipo de adaptaciones de la zona horaria.)

Entonces, primero se soluciona un problema que no se menciono, pero que es necesario solucionar, que es tema de la cultura, es decir si el equipo del cliente esta en Español y el servidor esta en Ingles, seguramente tendremos conflictos del orden de los dias y meses. Mientras una fecha valida en español es: dd/MM/yyyy en Ingles es: MM/dd/yyyy.

Esto se asegura entonces asi:

// Asigna la  propiedad CurrentCulture a U.S. English.
Thread.CurrentThread.CurrentCulture = new CultureInfo(“en-US”);

Con esto aseguramos que el control del cliente ya muestre el formato de la fecha como esta en el servidor. (Asumimos que el server esta en Ingles.)

Ahora aseguramos que el cliente muestre la hora que viene del servidor de base de datos y no se adapte a la zona horaria. Esto se hace con un UniversalTime asi:

//Como se menciono el valor viene de un Dataset

DateTime.Parse(dr[“NombreColumna”].ToString()).ToUniversalTime().ToString(“d”);

Con esto ya se asegura que muestre la fecha tal como esta dentro de la base de datos, pues hace una conversion del tipo de datos a Universal Time.

 

Espero les sirva. Saludos…

Roberto C Erazo M
MVP – Visual C#

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s