WCF Data Services (OData) から返された json DateTime を処理する方法
-
26-09-2019 - |
質問
ここには明らかな何かが欠けていると思います。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>
alert(new Date(1235764800000)) を実行すると、次の結果が得られます。
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");
}
解決
によると このmsdnリンク, DateTime
オブジェクトは...
... JSONで「/日付(ダニの数)/」として表されます。ダニの数は、1970年1月1日の真夜中から経過したダニの数(ミリ秒)を示す正または負の長い値です。
したがって、.NETが想定しているのは正しいですが、GMTではなくUTCです(ただし、 彼らは似ています)。がある いくつかの 良い 答え SO では、詳細を提供し、JSON をクライアントで使用可能な日付に解析するためのメソッドも提供します。
日付を UTC から特定のタイムゾーンに変換する限り、サーバー上で TimeZoneInfo
を持つクラス ConvertTimeFromUtc
方法。または、 JavaScriptConverter
クラス。JavaScriptには、 UTC
そして getTimezoneOffset
使用できる方法。
これがお役に立ち、幸運を祈ります。
他のヒント
これが役立つかもしれませんが、私は同じ問題に直面していて、このようなものを実装することになりました。それほどエレガントではありませんが、機能します。
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'));
});
}
これがお役に立てば幸いです。
これは問題なく動作するはずです。
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
これはすでに修正されており、これを確認することが議論されています 前の投稿
date.js スクリプトを使用します。以下をお試しください。
new Date(parseInt(yourDateValue)).toString("ddd, dd-MMM-yyyy, hh:mm:ss")
Javascript で WCF JSON 日付応答を解析している場合、Moment.js 日付フレームワークを使用すると、問題の多くが解消されます。 Moment.js - ASP.NET JSON 日付の解析. 。他にも便利な方法がいくつかあります。
私たちが生産します データ.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"));
}
);
これを試して:
function getDate(datestr) {
return new Date(eval('new ' + datestr.replace(/\//g, '')));
}
この返信は否決される可能性があります (!!) が、別の解決策は、よりわかりやすい方法で日付を返すように WCF サービスを変更することです。
これは、私の WCF サービスのサンプル JSON です。 UpdateDateOriginal
値 (WCF が DateTime 値に使用した煩わしいデフォルトの書式設定を使用)、そしてよりフレンドリーな UpdateDate
同じ DateTime 値のバージョン。
これを行うコードを次の記事に投稿しました。