Comment gérer JSON DateTime retourné de WCF Data Services (OData)
je crois que je manque quelque chose d'évident ici. Lorsque je demande une réponse JSON à un service OData, j'obtiens un résultat différent pour les propriétés DateTime que lorsque je demande XML. Je vais utiliser L'OData de NerdDinner comme exemple.
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>
quand je fais une alerte(nouvelle Date (1235764800000)) j'obtiens ce résultat:
j'obtiens aussi un résultat de 20h quand J'exécute la même requête avec LINQPad. pourquoi le fuseau horaire est incorrect dans le résultat JSON? Il semble supposer que la réponse est en GMT. Dois-je gérer cela sur le client (via javascript) ou est-ce quelque chose que je peux configurer sur le serveur?
j'utilise jQuery sur les services de données client et WCF (et Entity Framework) sur le serveur.
Mise à jour:
j'utilise Datejs du côté client pour gérer le formatage UTC datetime. Je me demande si c'est la bonne façon d'aller sur ce problème.
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");
}
8 réponses
Selon ce msdn lien , DateTime
les objets sont...
...représenté dans le JSON comme " / Date (nombre de tiques)/". Le nombre de tiques est une valeur longue positive ou négative qui indique le nombre de tiques (en millisecondes) qui se sont écoulées depuis minuit le 1er janvier 1970 UTC.
donc vous avez raison que .NET suppose, mais C'est UTC au lieu de GMT (bien que ils sont similaires ). Il ya certains bon réponses ici afin de donner plus de détails et également fournir des méthodes pour analyser le JSON dans une date utilisable sur le client.
en ce qui concerne la conversion des dates de UTC à un fuseau horaire spécifique, sur le serveur vous pouvez utiliser la classe TimeZoneInfo
qui a une méthode ConvertTimeFromUtc
. Ou vous pourriez écrivez un convertisseur personnalisé qui hérite de la classe JavaScriptConverter
. En javascript, il y a les méthodes UTC
et getTimezoneOffset
qui pourraient être utilisées.
Espérons que cela aide et bonne chance.
si cela peut aider, je faisais face au même problème et j'ai fini par mettre en œuvre quelque chose comme ça, pas si élégant mais ça fonctionne.
String.prototype.DateWCF = function(dateformat) {
return new Date(parseInt(this.match(/\/Date\(([0-9]+)(?:.*)\)\//)[1])).format(dateformat);
};
puis sur $.ajax
succès:
success: function(data) {
$.each(data, function() {
var hello = this.DateTimeProperty.DateWCF('dd-MM-yyyy'));
});
}
j'espère que cela peut être utile.
Cela devrait fonctionner très bien:
var date = new Date(parseInt(jsonDate.substr(6)));
la fonction substr sort la partie" /Date ( ", et la fonction parseInt obtient le nombre entier et ignore le") / " à la fin.
pour les dates JSON formatées ISO-8601, il suffit de passer la chaîne dans le constructeur de Date:
var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
cela a déjà été fixé et discuté qu'un coup d'oeil à ce post précédent
utilisant la date.js script.Essayez ci-dessous
new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
si vous analysez les réponses WCF JSON date en Javascript, le Moment est venu.js date framework supprime une grande partie du mal de tête: Moment.js-Parsing ASP.NET JSON date . Il a aussi quelques autres pratique des méthodes.
nous produisons des données .js comme client JavaScript pour les services OData. Si vous travaillez à partir d'un client Web, l'utilisation de cette bibliothèque va supprimer ce mal de tête ainsi que vous empêcher de rencontrer d'autres.
"151910920 des Données".js gère toutes les JSONP et autres préoccupations en votre nom, rendant la requête et l'analyse des données JSON aussi faciles: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"));
}
);
essayez ceci:
function getDate(datestr) {
return new Date(eval('new ' + datestr.replace(/\//g, '')));
}
cette réponse pourrait être rejetée (!!) mais une solution alternative est de simplement changer votre Service WCF pour retourner les dates d'une manière plus conviviale.
voici un exemple de JSON de mon service WCF, montrant une valeur UpdateDateOriginal
(en utilisant le formatage par défaut ennuyeux que WCF a utilisé pour ma valeur DateTime), et une version plus conviviale UpdateDate
de la même valeur DateTime.
j'ai Posté le code pour le faire dans l'article suivant: