web-dev-qa-db-fra.com

Comment gérer json DateTime renvoyé par WCF Data Services (OData)

Je crois qu'il me manque quelque chose d'évident ici. Lorsque je demande une réponse JSON à un service OData, les propriétés DateTime donnent un résultat différent de celui obtenu lorsque je demande du XML. Je vais utiliser le flux OData 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>

Lorsque je fais une alerte (nouvelle date (1235764800000)), j'obtiens le résultat suivant: alt text

J'obtiens également un résultat de 20 heures lorsque j'exécute la même requête avec LINQPad. Pourquoi le fuseau horaire est-il 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 définir sur le serveur? 

J'utilise jQuery sur le client et WCF Data Services (et Entity Framework) sur le serveur.

Mise à jour:

J'utilise Datejs sur le côté client pour gérer le formatage date/heure UTC. Je me demande si c'est la bonne façon de régler 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");
 }
20
Andy May

Selon ce lien msdn , les objets DateTime sont ...

... représenté dans JSON par "/Date(number of ticks) /". Le nombre de ticks est une valeur longue et positive ou négative qui indique indique le nombre de ticks (millisecondes) écoulés depuis Minuit le 01 janvier 1970 UTC .

Donc, vous avez raison de penser que .NET suppose, mais c'est UTC au lieu de GMT (bien que ils soient similaires ). Il y a quelquesbonnesréponses ici sur SO qui donnent plus de détails et fournissent également des méthodes pour analyser le JSON en une date utilisable sur le client.

En ce qui concerne la conversion des dates de l'heure UTC en un fuseau horaire spécifique, vous pouvez utiliser la classe TimeZoneInfo class qui possède une méthode ConvertTimeFromUtc . Vous pouvez également écrire un convertisseur personnalisé qui hérite de la classe JavaScriptConverter . En javascript, il existe les méthodes UTC et getTimezoneOffset qui peuvent être utilisées.

J'espère que ça t'aide et bonne chance.

19
Bryan

Si cela pouvait 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 marche.

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

puis sur $.ajax success:

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

J'espère que cela peut être utile.

7
Andrea Celin

Cela devrait fonctionner très bien:

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

La fonction substr supprime 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 Date:

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

Cela a déjà été corrigé et discuté qu'un regard sur ceci post précédent

4
d1jhoni1b

Utilisation du script date.js.Essayez ci-dessous

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

Si vous analysez les réponses de date JSON WCF en Javascript, le framework de date Moment.js élimine en grande partie le problème: Moment.js - Analyse de dates JSON ASP.NET . Il a également d'autres méthodes utiles.

1
Alex Ross

Cette réponse risque d’être rejetée (!!), mais une autre solution consiste à modifier votre service WCF afin de renvoyer les dates de manière plus conviviale.

Voici un exemple de code JSON de mon service WCF, affichant une valeur UpdateDateOriginal (utilisant le formatage par défaut ennuyeux utilisé par WCF pour ma valeur DateTime), ainsi qu'une version UpdateDate plus conviviale de la même valeur DateTime.

enter image description here

J'ai posté le code pour le faire dans l'article suivant:

Modifier la sérialisation de la date par défaut dans WCF

0
Mike Gledhill

Essaye ça:

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

Nous produisons data.js en tant que client JavaScript pour les services OData. Si vous travaillez à partir d'un client Web, l'utilisation de cette bibliothèque supprimera ce mal de tête et vous évitera de vous heurter à d'autres.

Data.js gère tous les problèmes JSONP et autres en votre nom, ce qui facilite la demande et l'analyse de données JSON:

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")); 
  } 
);
0