Question

Je crois que je suis manque quelque chose ici évident. Quand je demande une réponse JSON d'un service OData je reçois un résultat différent pour les propriétés DateTime que je fais quand je demande XML. Je vais utiliser l'alimentation NerdDinner OData 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)) Je reçois ce résultat: text alt

Je reçois aussi un résultat de 20 heures quand je lance la même requête avec LINQPad. Pourquoi le fuseau horaire 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 que je peux mettre 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 l'UTC datetime formatage. Je me demande si cela est la bonne façon d'aller à 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");
 }
Était-ce utile?

La solution

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

  

... représenté en JSON comme « / Date (numéro   des tiques) / ». Le nombre de tiques est une   positive ou négative que la valeur à long   indique le nombre de tiques   (millisecondes) qui se sont écoulées depuis   minuit 01 Janvier, 1970 UTC.

Vous avez raison cela suppose .NET, mais il est UTC au lieu de GMT (si certains bon réponses ici sur le SO qui donnent plus de détails et de fournir également des méthodes pour l'analyse du JSON en une date utilisable sur la client.

En ce qui concerne la conversion en date UTC à un fuseau horaire spécifique, sur le serveur vous pouvez utiliser le TimeZoneInfo classe qui a un UTC et les méthodes de getTimezoneOffset qui pourraient être utilisés.

Hope this helps et bonne chance.

Autres conseils

Si cela peut aider, je faisais face au même problème et j'ai fini de mettre en œuvre quelque chose comme ça, pas si élégant mais il fonctionne.

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

puis sur le succès de $.ajax:

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

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

Utilisation date.js script.Try ci-dessous

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

Si vous WCF l'analyse des réponses de date JSON en Javascript, le cadre de la date Moment.js supprime beaucoup de maux de tête: Moment.js - Parsing ASP.NET JSON dates . Il a aussi quelques autres méthodes pratiques.

Nous produisons data.js en tant que client JavaScript pour les services OData. Si vous travaillez à partir d'un client Web, en utilisant cette bibliothèque enlèvera ce mal de tête ainsi que vous empêcher de courir dans d'autres.

data.js gère tous les JSONP et d'autres préoccupations en votre nom, ce qui rend la demande et l'analyse des données JSON ce facile:

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 se voté contre (!!), mais une solution alternative est de changer simplement votre service WCF pour retourner les dates d'une manière plus conviviale.

Voici quelques échantillons JSON de mon service WCF, montrant une valeur de UpdateDateOriginal (en utilisant la valeur par défaut ennuyeux formatage WCF a utilisé pour ma valeur DateTime), et une version UpdateDate plus conviviale de la même valeur DateTime.

entrer image description ici

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

changement sérialisation date par défaut dans WCF

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top