web-dev-qa-db-ja.com

WCF Data Services(OData)から返されたjson DateTimeを処理する方法

ここに明らかな何かが欠けていると思います。 ODataサービスからJSON応答を要求すると、XMLを要求するときとは異なる結果がDateTimeプロパティに対して得られます。例としてNerdDinner ODataフィードを使用します。

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>

アラート(新しい日付(1235764800000))を実行すると、次の結果が得られます。 alt text

LINQPadで同じクエリを実行すると、午後8時の結果も得られます。 JSONの結果でタイムゾーンが正しくないのはなぜですか?応答がGMTであると想定しているようです。これを(JavaScriptを介して)クライアントで処理する必要がありますか、それともサーバーで設定できるものですか?

クライアントではjQueryを、サーバーではWCF Data Services(およびEntity Framework)を使用しています。

更新:

クライアント側で Datejs を使用して、UTC日時フォーマットを処理しています。これがこの問題を解決する正しい方法かどうか疑問に思っています。

 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

このmsdnリンク によると、DateTimeオブジェクトは...

... JSONでは「/ Date(number of ticks)/」として表されます。目盛りの数は正または負のlong値で、1970年1月1日UTC UTC 10:00から経過した目盛り(ミリ秒)の数を示します。

ですから、.NETが想定していることは正しいですが、それはGMTではなくUTCです(ただし 似ています )。 somegoodanswers がここにありますSO詳細とJSONを解析するためのメソッドを提供しますクライアントで使用可能な日付に。

日付をUTCから特定のタイムゾーンに変換する限り、サーバーでは TimeZoneInfo のクラス ConvertTimeFromUtc を使用できます。方法。または、 JavaScriptConverter クラスから継承するカスタムコンバーターを作成することもできます。 JavaScriptには、使用できる UTC および getTimezoneOffset メソッドがあります。

これがお役に立てば幸いです。

19
Bryan

これが役立つかもしれない場合、私は同じ問題に直面していたので、このような何かを実装することに終わりましたが、それほどエレガントではありませんが、うまくいきます。

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

その後、$.ajax 成功:

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

これがお役に立てば幸いです。

7
Andrea Celin

これはうまくいくはずです:

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

Substr関数は「/ Date(」の部分を取り出し、parseInt関数は整数を取得し、最後の「)/」を無視します。

ISO-8601形式のJSON日付の場合、Dateコンストラクターに文字列を渡すだけです。

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

これはすでに修正されており、これを見ると議論されました 前の投稿

5
d1jhoni1b

Date.jsスクリプトを使用します。以下をお試しください

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

JavaScriptでWCF JSON日付応答を解析している場合、Moment.js日付フレームワークは頭痛の多くを取り除きます: Moment.js-ASP.NET JSON日付の解析 。他にもいくつか便利な方法があります。

1
Alex Ross

この返信は不合格になる可能性があります(!!)が、別の解決策は、WCFサービスを変更して日付をよりわかりやすい方法で返すことです。

これは、WCFサービスからのサンプルJSONで、UpdateDateOriginal値(WCFがDateTime値に使用した厄介なデフォルトのフォーマットを使用)と、同じDateTime値のわかりやすいUpdateDateバージョンを示しています。

enter image description here

これを行うためのコードを次の記事に投稿しました。

WCFのデフォルトの日付のシリアル化を変更

0
Mike Gledhill

これを試して:

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

data.js をODataサービスのJavaScriptクライアントとして生成します。 Webクライアントから作業している場合、このライブラリを使用すると、この頭痛の種が取り除かれるだけでなく、他人に実行されるのを防ぐことができます。

Data.jsは、ユーザーに代わってJSONPおよびその他の懸念事項をすべて処理し、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")); 
  } 
);