Cómo manejar json DateTime devuelto desde WCF Data Services(OData)
wcf-data-services (8)
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.
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 (nueva fecha (1235764800000)) obtengo este resultado:
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 es 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.
Actualizar:
Estoy usando Datejs en el lado del cliente para manejar el formato UTC de fecha y hora. 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");
}
De acuerdo con este enlace msdn , los objetos DateTime
son ...
... representado en JSON como "/ Fecha (número de tics) /". El número de tics es un valor largo positivo o negativo que indica el número de tics (milisegundos) que han transcurrido desde la medianoche del 1 de enero de 1970 UTC.
Así que está en lo cierto .NET asume, pero es UTC en lugar de GMT (aunque son similares ). Hay some good answers 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 podría escribir un convertidor personalizado que herede de la clase JavaScriptConverter
. En javascript, existen los métodos UTC
y getTimezoneOffset
que podrían usarse.
Espero que esto ayude y buena suerte.
Esta respuesta puede ser rechazada (!!) pero una solución alternativa es simplemente cambiar su Servicio WCF para devolver las fechas de una manera más amigable.
Aquí hay un ejemplo de JSON de mi servicio WCF, que muestra un valor UpdateDateOriginal
(utilizando el molesto formato predeterminado que WCF ha utilizado para mi valor de DateTime) y una versión UpdateDate
más UpdateDate
del mismo valor de DateTime.
Publiqué el código para hacer esto en el siguiente artículo:
Esto debería funcionar bien:
var date = new Date(parseInt(jsonDate.substr(6)));
La función substr saca la parte "/ Fecha (", y la función parseInt obtiene el entero e ignora el ") /" al final.
Para fechas JSON con formato ISO-8601, simplemente pase la cadena al constructor de Fecha:
var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Esto ya fue arreglado y discutido que un vistazo a esta publicación anterior
Producimos data.js como un 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 todas las preocupaciones JSONP y otras en su nombre, haciendo que solicitar y analizar datos JSON sea tan 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"));
}
);
Prueba esto:
function getDate(datestr) {
return new Date(eval(''new '' + datestr.replace(////g, '''')));
}
Si está analizando las respuestas de fecha de WCF JSON en Javascript, el marco de fechas de Moment.js elimina gran parte del dolor de cabeza: Moment.js - Análisis de las fechas de ASP.NET JSON . También tiene algunos otros métodos útiles.
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);
};
luego en el éxito de $.ajax
:
success: function(data) {
$.each(data, function() {
var hello = this.DateTimeProperty.DateWCF(''dd-MM-yyyy''));
});
}
Espero que esto pueda ser útil.
Usando el script date.js. Intenta a continuación
new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")