ここに明らかな何かが欠けていると思います。 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))を実行すると、次の結果が得られます。
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では「/ 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
メソッドがあります。
これがお役に立てば幸いです。
これが役立つかもしれない場合、私は同じ問題に直面していたので、このような何かを実装することに終わりましたが、それほどエレガントではありませんが、うまくいきます。
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日付の解析 。他にもいくつか便利な方法があります。
この返信は不合格になる可能性があります(!!)が、別の解決策は、WCFサービスを変更して日付をよりわかりやすい方法で返すことです。
これは、WCFサービスからのサンプルJSONで、UpdateDateOriginal
値(WCFがDateTime値に使用した厄介なデフォルトのフォーマットを使用)と、同じDateTime値のわかりやすいUpdateDate
バージョンを示しています。
これを行うためのコードを次の記事に投稿しました。
これを試して:
function getDate(datestr) {
return new Date(eval('new ' + datestr.replace(/\//g, '')));
}
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"));
}
);