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: alt text

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");
 }
20
demandé sur Andy May 2010-09-29 08:25:53

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.

18
répondu Bryan 2017-05-23 12:34:51

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.

6
répondu Andrea Celin 2011-07-13 16:40:40

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

4
répondu d1jhoni1b 2017-05-23 11:55:15

utilisant la date.js script.Essayez ci-dessous

new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
3
répondu Mshini 2016-08-08 19:18:58

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.

1
répondu Alex Ross 2013-01-22 01:18:51

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")); 
  } 
);
0
répondu Mark Stafford - MSFT 2012-06-29 15:20:00

essayez ceci:

    function getDate(datestr) {
        return  new Date(eval('new ' + datestr.replace(/\//g, '')));
    }
0
répondu Anton Sivov 2013-12-25 09:51:08

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.

enter image description here

j'ai Posté le code pour le faire dans l'article suivant:

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

0
répondu Mike Gledhill 2017-05-23 10:29:39