Campos de tipo DateTime y API REST en SharePoint


Hola a todos,

Como os comentaba ayer, para poner en práctica los últimos avances que he tenido con las aplicaciones de SharePoint, he desarrollado una SharePoint Hosted App que utiliza, para la comunicación y las operaciones con SharePoint, API REST.

RoomReservation: Mi primera SharePoint Hosted App

Código en GitHub

Lo que hoy os quiero contar, es una de las cosas que más me ha entretenido en el desarrollo de la aplicación y tiene que ver con la manipulación de campos de tipo DateTime y la API REST. En sí, no tiene nada especialmente complejo, aunque a continuación veremos las particularidades que hay que tener en cuenta.

Filtrando campos de tipo DateTime en una petición API REST

El filtrado de campos de tipo fecha a través de API REST es muy sencillo, tan solo hay que pasar la fecha en el formato correcto:

https:///_api/web/lists/getbytitle(list)/items?$filter=DateFieldName eq datetime’yyyy-mm-ddThh:mm:ss’

El formato de la fecha como podéis ver es el siguiente “yyyy-mm-ddThh:mm:ss”

Datos devueltos en una consulta de API REST de tipo DateTime

Con los datos de tipo DateTime que nos devuelve una consulta API REST, empieza a haber algunas cosas a tener en cuenta. SharePoint, a través de API REST, nos devuelve todos los campos de tipo DateTime formateados como UTC. Por tanto, si mostramos los datos tal cual nos los devuelve API REST y nuestra configuración regional es distinta de la UTC (por ejemplo, en la península es UTC +1), no veremos los resultados que esperábamos. Por ejemplo, si hemos almacenado la siguiente fecha 2015-03-03T10:30:00 en el calendario de SharePoint y estamos en UTC+1, nos devolverá 2015-03-03T09:30:00.

Para solventar esto tenemos que aplicar la corrección correspondiente al TimeOffSet con respecto a la hora en formato UTC. Os pongo el código que he usado yo en mi aplicación y os cuento lo más importante. Para manipular las fechas he utilizado una librería de javascript llamada moment.js que añade algunas funcionalidades extra al objeto de tipo Date básico de Javascript, y que permitirá hacer sumas y restas a fechas.


var offset;

function GetTimeOffset(){
        var deferred = $.Deferred();

        var appweburl = MyApp.AppSPUtils.GetQueryStringParameter("SPAppWebUrl");
        var hostweburl = MyApp.AppSPUtils.GetQueryStringParameter("SPHostUrl");

        executor = new SP.RequestExecutor(appweburl);

        executor.executeAsync({
            method: "GET",
            url: appweburl + "/_api/SP.AppContextSite(@target)/web/regionalsettings/timezone?@target='" + hostweburl + "'",
            headers: {
                "accept": "application/json;odata=verbose",
                "content-type": "application/json;odata=verbose"
            },
            success: function (data) {
                var jsonObject = JSON.parse(data.body);
                offset = jsonObject.d.Information.Bias;

                deferred.resolve();
            },
            error: function (data) {
                deferred.reject();
            }
        });

        return deferred.promise();
    }
function ConvertToGetLocalTime(UTCdate) {

        var date = moment(UTCdate);

        if (date.utcOffset() > 0)
            date = date.subtract(offset, 'm');
        else
            date = date.add(((-1) * offset), 'm');

        return date.toISOString();
    }

El primer código que vemos, nos permite obtener por medio de API REST, el TimeOffSet de la configuración regional que tenemos en nuestro sitio de SharePoint con respecto a UTC. Si por ejemplo, estamos en UTC+1, el valor que obtendremos será -60, que son los minutos que habría que restar a la hora, para convertirla a formato UTC.

Por tanto, una vez obtenido el offset de nuestra configuración regional de sitio, aplicamos la conversión que vemos en la función ConvertToGetLocalTime que recibirá un string con el formato de fecha obtenido de la consulta por API REST (yyyy-mm-ddThh:mm:ss) y devuelve una fecha con el mismo formato y adaptado a la hora local configurada en nuestro sitio.

Añadiendo elementos a una lista con campos de tipo DateTime con API REST

Cuando lo que queremos es usar POST para añadir a través de API REST un elemento que tiene campos de tipo DateTime, el problema es el contrario. Lo que la API REST considera que recibe es una fecha en formato UTC y al almacenarla, la convertirá en el formato correspondiente a la configuración regional establecida. Por ejemplo, si pasamos como campo 2015-03-03T10:30:00 y tenemos una configuración UTC+1, lo que se almacenará será 2015-03-03T11:30:00.

Para solucionar esto, aplicaremos la configuración inversa que en el caso anterior por medio de la siguiente función:

function ConvertToPostLocalTime(UTCdate) {

        var date = moment(UTCdate);

        if (date.utcOffset() > 0)
            date = date.add(offset, 'm');
        else
            date = date.subtract(((-1) * offset), 'm');

        return date.toISOString();
    }

Y esto es todo por hoy, como podéis ver, trabajar con fechas y API REST requiere tener en cuenta la configuración regional y aplicar las conversiones a las fechas que correspondan, ya que ésta siempre trabaja con UTC tanto a la hora de hacer POST como GET.

Espero que os sea útil y os ahorréis ese tiempo de más que me ha llevado a la hora de trabajar con esto.

Saludos a todos.

Anuncios

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