Inherits Cloud

Loving Microsoft Cloud, specially Office 365

SharePoint 2010: Formateando los DateTime, según las regional settings del cliente

Antes de entrar en materia, vamos a ver el escenario final:

Lo que pretendemos es que, cuando se muestre la fecha de creación de un ítem de una lista, desde un webpart personalizado (o control, o lo que sea), esa fecha y hora, esté ajustada a la zona horaria del usuario que está viendo la web.

Lo otro a considerar, es que SharePoint, almacena (en su BBDD) la fecha, en modo UTC

Con esto, lo que buscamos es lo siguiente:

Si el ítem se creó cuando eran las 25/05/2012 18:00 en UTC time, queremos que cuando un usuario ve la web desde, pongamos España, tengamos: 25/05/2012 20:00 (UTC +2). El +2 es ahora, en horario de verano. Fuera del horario de verano, sería: 25/05/2012 19:00 (UTC +1). Y para acabar con el ejemplo, si la web la visita un usuario de Sidney, cuya diferencia horaria con UTC es de +10, pues la fecha hora sería: 26/05/2012 03:00 (es decir, que hemos pasado al día siguiente).

Pero, ¿Cómo puedo saber la configuración horaria que tiene el PC del usuario?, pues bien, por desgracia, esta información, no la tenemos disponible en las cabeceras HTTP de la petición, por lo que es algo complicadillo.

Por suerte, podemos enviar código JavaScript al cliente que, en caso de que no bloquee el JavaScript, este código haga:

  1. Consulte la fecha hora del cliente, y extraiga la diferencia horaria, con respecto al UTC
  2. Cree una cookie, donde se guarde esa diferencia
  3. Reenvíe la petición al servidor, para que éste recoja la cookie, y calcule la fecha de creación del ítem, según dicho offset con respecto al UTC

¿Y cómo hacemos todo eso en SharePoint?

Existen varias formas para poder inyectar ese JavaScript: Crear un HTTPModule, usar un DelegateControl, y alguna más. Por no hacerlo muy complicado, en este caso, vamos a crear un control, que incluiremos en la MasterPage del site.

Primero creamos el control de SharePoint:


Sobre el render del Control, lo que primero hacemos, es comprobar si el navegador acepta cookies. Si las acepta, lo siguiente es comprobar si ya hemos creado la cookie. Si ya la hemos creado, luego la usaremos para formatear el DateTime. Si no la hemos creado, registramos el código JavaScript necesario para ello.


Y aquí el código que invoca la funciones JS


Fijaros como en el código anterior, estableces el “window.location” a sí mismo. De esta forma recargamos la página, y la cookie llega al servidor.

Es importante notar que toda la parte de JavaScript, sólo se inserta y utiliza, si no existe la cookie con el Offset del UTC. Así se optimiza el tamaño de página.

OK, ya tenemos la cookie con el offset, ahora ¿cómo la usamos?

Primero obtenemos el valor de la cookie:


Asumimos que tenemos una variable DateTime, con la fecha de creación de un ítem de lista de SharePoint. Para aplicar el offset UTC del cliente, hacemos:


Es decir, sumamos/restamos las horas de diferencia horaria.

Pero, si habías dicho que SP guarda los DateTime en UTC ¿por qué estás pasando el DateTime a ToUniversalTime? pues sencillamente, porque cuando el modelo de objetos de SharePoint, te devuelve el valor de la columna del SPListItem, te lo da aplicando la hora local del servidor, por lo que hay que pedirle, explícitamente, que te dé la hora UTC.

Con esta técnica, podemos formatear la fecha/hora, según la configuración del cliente. Algo que para soluciones globalizadas, puede ser de gran ayuda.

Espero que os sirva.

Un saludo!!

2 Comentarios

  1. lmanez

    29 Mayo, 2012 at 7:00 pm

    Hola Juan Carlos,
    muchas gracias por el comentario.

    Probablemente tb se pueda usar ToBinary, especificando el Kind del cliente, no lo conocía. No sé si es mejor o peor, supongo que es muy parecido al AddHours que hago yo.

    El formateo es lo de menos. Lo que quería destacar en el post, es cómo podemos sacar el Offset UTC del cliente, que eso solo puede ser tirando de javascript y de cookie. Y además, cómo hacerlo dentro de SharePoint, que siempre añade un plus de peligrosidad 🙂

    Saludos!!

Deja un comentario

Tu dirección de correo electrónico no será publicada.

*

© 2017 Inherits Cloud

Tema por Anders NorenArriba ↑