36

次のJSON日付表現があるとします。

"\/Date(1221644506800-0700)\/"

これをJavaScriptの日付タイプの形式にどのように逆シリアル化しますか?

以下に示すように、MSAJAXJavaScrioptSerializerを使用してみました。

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

ただし、返されるのはリテラル文字列の日付だけです。

4

7 に答える 7

18

ASP.NET Atlas /AJAXに取り組んだBertrandLeRoyは、JavaScriptSerializer DateTime出力の設計について説明し、不思議な先頭と末尾のスラッシュの起源を明らかにしました。彼はこの勧告をしました:

「\/Date((\ d +))\ /」の単純な検索を実行し、評価の前(ただし検証後)に「newDate($ 1)」に置き換えます

私はそれを次のように実装しました:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

これは他の多くの答えに非常に近いです:

  • Sjoerd Visscherが行ったように、アンカーされた正規表現を使用します。^と$を忘れないでください。
  • string.replace、およびRegExの「g」または「i」オプションは避けてください。"/ Date(1271389496563)// Date(1271389496563)/"はまったく機能しないはずです。
于 2010-04-16T16:25:15.240 に答える
11

JSON 値は、文字列、数値、オブジェクト、配列、true、false、または null です。したがって、これは単なる文字列です。JSON で日付を表す正式な方法はありません。この構文は、asp.net ajax 実装からのものです。その他は、ISO 8601 形式を使用します。

次のように解析できます。

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);
于 2008-09-17T12:07:23.743 に答える
6

ASP.net AJAX デシリアライズ メソッドで使用される正規表現は、"/Date(1234)/" のような文字列を探します (文字列自体には、実際には引用符とスラッシュを含める必要があります)。このような文字列を取得するには、引用符とバック スラッシュ文字をエスケープする必要があるため、文字列を作成する JavaScript コードは "\"\/Date(1234)\/\"" のようになります。

これは機能します。

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

ちょっと変ですが、日付をシリアル化し、そこから返された文字列をシリアル化し、クライアント側で一度逆シリアル化する必要があることがわかりました。

このようなもの。

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);
于 2009-01-09T16:59:54.710 に答える
3

Microsoft Ajax を使用したくない場合は、文字列クラスにプロトタイプ関数を追加するだけです。

例えば

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

eval を使いたくないですか?次のような簡単なことを試してください

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

余談ですが、私は Microsoft がこの形式を使用することで誤解を招くと思っていました。ただし、JSON で日付を記述する方法を定義する場合、JSON 仕様はあまり明確ではありません。

于 2009-10-29T22:32:43.080 に答える
2

実際、momentjs はこの種のフォーマットをサポートしています。

    var momentValue = moment(value);

    momentValue.toDate();

これは、JavaScript の日付形式で値を返します

于 2016-12-28T18:26:28.667 に答える
1

大きい数字はJS標準時

new Date(1221644506800)

2008 年 9 月 17 日水曜日 19:41:46 GMT+1000 (EST)

于 2008-09-17T11:41:48.377 に答える