2010-09-29 41 views
20

Creo que me falta algo obvio aquí. Cuando solicito una respuesta JSON de un servicio OData, obtengo un resultado diferente para las propiedades de DateTime que cuando hago una solicitud de XML. Utilizaré el feed NerdDinner OData como ejemplo.Cómo manejar json DateTime devuelto por WCF Data Services (OData)

JSON:

http://www.nerddinner.com/Services/OData.svc/Dinners(1)?$format=json 
"EventDate": "\/Date(1235764800000)\/" 

XML:

http://www.nerddinner.com/Services/OData.svc/Dinners(1) 
<d:EventDate m:type="Edm.DateTime">2009-02-27T20:00:00</d:EventDate> 

Cuando hago una alerta (new Date (1235764800000)) me sale este resultado: alt text

I También obtengo un resultado de 8PM cuando ejecuto la misma consulta con LINQPad. ¿Por qué la zona horaria es incorrecta en el resultado de JSON? Parece suponer que la respuesta está en GMT. ¿Debo manejar esto en el cliente (a través de javascript) o es algo que puedo configurar en el servidor?

Estoy usando jQuery en el cliente y WCF Data Services (y Entity Framework) en el servidor.

Actualización:

estoy usando Datejs en el lado del cliente para manejar el formato de fecha y hora UTC. Me pregunto si esta es la forma correcta de resolver este problema.

function getDateString(jsonDate) { 
    if (jsonDate == undefined) { 
     return ""; 
    } 
    var utcTime = parseInt(jsonDate.substr(6)); 

    var date = new Date(utcTime); 
    var minutesOffset = date.getTimezoneOffset(); 

    return date.addMinutes(minutesOffset).toString("M/d/yyyy h:mm tt"); 
} 

Respuesta

18

Según this msdn link, DateTime objetos son ...

... representados en JSON como "Fecha/(número de garrapatas ) /". El número de tics es un valor positivo o negativo largo que indica el número de ticks (milisegundos) que han transcurrido desde la medianoche del 01 de enero de 1970 UTC.

Tiene la certeza de que .NET asume, pero es UTC en lugar de GMT (aunque they are similar). Hay somegoodanswers aquí en SO que dan más detalles y también proporcionan métodos para analizar el JSON en una fecha utilizable en el cliente.

En cuanto a la conversión de fechas de UTC a una zona horaria específica, en el servidor puede usar la clase TimeZoneInfo que tiene un método ConvertTimeFromUtc. O puede escribir un convertidor personalizado que herede de la clase JavaScriptConverter. En javascript, existen los métodos UTC y getTimezoneOffset que se pueden usar.

Espero que esto ayude y buena suerte.

6

Si esto puede ayudar, estaba enfrentando el mismo problema y terminé implementando algo como esto, no tan elegante pero funciona.

String.prototype.DateWCF = function(dateformat) { 
    return new Date(parseInt(this.match(/\/Date\(([0-9]+)(?:.*)\)\//)[1])).format(dateformat); 
}; 

entonces $.ajax éxito:

 success: function(data) { 
      $.each(data, function() { 
       var hello = this.DateTimeProperty.DateWCF('dd-MM-yyyy')); 
      }); 
     } 

espero que esto puede ser útil.

3

Usando date.js script.Try continuación

new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss") 
0

Producimos data.js como cliente JavaScript para servicios OData. Si está trabajando desde un cliente web, el uso de esta biblioteca eliminará este dolor de cabeza y evitará que se encuentre con otros.

Data.js maneja todo el JSONP y otras preocupaciones en su nombre, por lo que solicitar y analizar datos JSON fácil:

OData.read( 
    "http://services.odata.org/Northwind/Northwind.svc/Categories", 
    function (data) { 
    var html = ""; 
    $.each(data.results, function(l) { html += "<div>" + l.CategoryName + "</div>"; }); 
    $(html).appendTo($("#target-element-id")); 
    } 
); 
1

Si estás analizar respuestas fecha WCF JSON en JavaScript, el momento. js date framework elimina gran parte del dolor de cabeza: Moment.js - Parsing ASP.NET JSON Dates. También tiene algunos otros métodos útiles.

0

Prueba esto:

function getDate(datestr) { 
     return new Date(eval('new ' + datestr.replace(/\//g, ''))); 
    } 
4

Esto debería funcionar bien:

var date = new Date(parseInt(jsonDate.substr(6))); 

La función substr lleva a cabo el "/ Fecha (" parte, y la función parseInt obtiene el número entero e ignora el ")/" al final.

Para formato ISO-8601 fechas JSON, sólo tiene que pasar la cadena en la Fecha constructor:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support 

Esto ya se fijó y se discutió que un vistazo a este previous post

0

Esta respuesta puede ser que consiga votó en contra (!!) pero una solución alternativa es simplemente cambiar su Servicio WCF para devolver las fechas de una manera más amigable.

He aquí algunos ejemplos de JSON de mi servicio WCF, mostrando un valor UpdateDateOriginal (utilizando el formato predeterminado molesto que WCF ha utilizado para mi valor DateTime), y una versión más amigable UpdateDate del mismo valor DateTime.

enter image description here

He publicado el código para hacer esto en el siguiente artículo:

Change default date serialization in WCF

Cuestiones relacionadas