martes, 27 de agosto de 2013

Importancia DateTimeKind en escenarios de intercambio XML II

Hace un tiempo en

areaTIC

publicamos un articulo sobre un caso curioso al intercambiar

XML

mediante

soap

contra otro servidor (java) desde .NET.

Hasta ese momento sólo había tenido problemas con el tipo DateTime? (nullable), pero hoy revisando unos temas he visto que hay más casos donde hay que ir con cuidado y especificar bien la zona horaria para evitar problemas.

Veamos otro ejemplo diferente al nullable:
DateTime fechaDesde = new DateTime(2013, 08, 27, 15, 0, 0);
DateTime fechaHasta = DateTime.Now;
Al serializar estos valores el resultado es el siguiente (son las 17:15):
<fechaDesde>2013-08-27T15:00:00</fechaDesde>
<fechaHasta>2013-08-27T17:15:00.6152148+02:00</fechaHasta>
Yo me encuentro en la zona Central Europea (BCN) por eso concatena un +2:00 correspondiente a la zona horaria en la fecha Hasta, pero en la fecha desde no especifica zona horaria por lo que si no está controlado en servidor seguramente recibirá el valor "17:00" (Utc) en vez de "15:00" como quería enviar.

En cambio si definimos la fechaDesde de este modo ya estaríamos especificando el formato ok y el servidor lo procesará bien.
DateTime fechaDesde = new DateTime(2013, 08, 27, 15, 0, 0,DateTimeKind.Local);
DateTime fechaHasta = DateTime.Now;
Al serializar estos valores el resultado es el siguiente (son las 17:15):
<fechaDesde>2013-08-27T15:00:00+02:00</fechaDesde>
<fechaHasta>2013-08-27T17:15:00.6152148+02:00</fechaHasta>
A la inversa también estaba teniendo problemas, es decir asumía que toda petición que me llegaba vía

soap/xml

me venía en formato "Local" con lo que estaba provocando un desfase importante al notificar esa fecha. Por ejemplo suponeros el caso que una tercera parte involucrada espera esa fecha que recibes en un fichero de texto con formato "yyyy/MM/dd" y yo recibo "19/08/2013 23:00 Z" (donde z es equivalente a Utc o no especificar zona horaria). En este caso notificaríamos como fecha "2013/08/19". Si el servidor me hubiese notificado la fecha en formato "local" hubiese recibido como valor "20/08/2013 00:00 +02:00" y por tanto la fecha a notificar al tercero difiere de un día.

Conclusión, es importante pactar el valor de zona horaria que cada parte va a utilizar y en caso que no sea posible tenemos que obligarnos a que cada vez que recibamos una fecha por este sistema de intercambio controlar el formato y convertirlo en caso que sea necesario. A continuación un ejemplo (se debería controlar más formatos pero es por hacernos una idea):
if (fecha.Kind == DateTimeKind.Utc)
    fecha = TimeZoneInfo.ConvertTimeFromUtc(fecha,TimeZoneInfo.Local);
Hasta aquí el artículo de hoy, recordar que podéis seguir

areaTIC

en las redes sociales. Esperamos tu participación!

No hay comentarios:

Publicar un comentario