web-dev-qa-db-ja.com

JSONを解析してJavaScriptでDateオブジェクトを受け取る方法は?

次のJSONがあります。

\/Date(1293034567877)\/

これは、この.NETコードの結果です。

var obj = DateTime.Now;
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
serializer.Serialize(obj).Dump();

今私が直面している問題は、JavaScriptでこれからDateオブジェクトを作成する方法です。私が見つけることができたのは、信じられないほどの正規表現ソリューション(多くのバグを含む)でした。

これはすべてJavaScripにあるため、エレガントなソリューションがないとは信じられません。JavaScriptコードであるはずのJSON(JavaScript Object Notation)を読み取ろうとしているJavaScriptコードを意味しますここで良い仕事をしてください。

また、動作するようにできなかった評価ソリューションもいくつか見ました(セキュリティの脅威として指摘されている以外に)。

エレガントな方法でそれを行う方法は本当にありませんか?

実際の答えのない同様の質問:
GWTでASP.NET JSON日付形式を解析する方法

101
Piotr Owsiak

日付の標準JSON表現はありません。 @jAndyが提案したことを実行する必要があり、DateTimeをまったくシリアル化しないでください。 RFC 1123日付文字列ToString("r")またはUnix-Epochからの秒数、またはDateを構築するためにJavaScriptで使用できる何かを送信するだけです。

46
Jacob

JSON.parse関数は、オプションのDateTime reviver関数を受け入れます。次のような関数を使用できます。

dateTimeReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = /\/Date\((\d*)\)\//.exec(value);
        if (a) {
            return new Date(+a[1]);
        }
    }
    return value;
}

それから電話する

JSON.parse(somejsonstring,dateTimeReviver)

そして、あなたの日付が正しく出てきます

113
Tim

Roy Tinkerからの回答はこちら

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

彼が言うように:substr関数は "/ Date("部分を取り出し、parseInt関数は整数を取得し、最後の ")/"を無視します。結果の数値は、Dateコンストラクターに渡されます。

もう1つのオプションは、JavaScriptが簡単に読み取れるように、情報をASP側で適切にフォーマットすることです。日付に対してこれを行うことを検討してください。

DateTime.Now()

これは、次のような形式を返します。

7/22/2008 12:11:04 PM

これを次のようなJavaScript Dateコンストラクターに渡すと:

var date = new Date('7/22/2008 12:11:04 PM');

変数dateは、この値を保持するようになりました。

Tue Jul 22 2008 12:11:04 GMT-0700 (Pacific Daylight Time)

当然、このDateTimeオブジェクトを、JS Dateコンストラクターが受け入れる任意の種類の文字列/ intにフォーマットできます。

44
treeface

javaScriptスタイルのISO8601日付をJSONで使用する場合、これを MDN から使用できます。

var jsonDate = (new Date()).toJSON();
var backToDate = new Date(jsonDate);
console.log(jsonDate); //2015-10-26T07:46:36.611Z
15
LeeGee

JavaScriptでJSON日付を通常の日付形式に変換できます。

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

どうしたの:

new Date(1293034567877);

これは「2010年12月22日水曜日16:16:07 GMT + 0000(GMT標準時)」を返します。

または、jsonから番号を取得する必要がありますか?

5
Psytronic

日付は常に悪夢です。古い質問に答えると、おそらくこれが最もエレガントな方法です。

eval(("new " + "/Date(1455418800000)/").replace(/\//g,""))

Evalを使用して、文字列をjavascriptコードに変換します。次に、「/」を削除し、置換関数に正規表現を追加します。 newから始めると、文章はこれを実行します。

new Date(1455418800000)

さて、私がずっと前に使い始めた一つのことは、ティックで表される長い値です...なぜですか?まあ、ローカライズし、すべてのサーバーまたはすべてのクライアントで日付がどのように構成されているかを考えるのをやめます。実際、データベースでも使用しています。

おそらくこの答えにはかなり遅れていますが、ここにいる誰でも助けることができます。

私はこれが非常に古いスレッドであることを知っていますが、これを投稿して、私がやったようにこれにぶつかる人を助けることを望みます。

サードパーティのスクリプトの使用を気にしない場合は、 moment、js を使用できます。その後、.format()を使用して、任意の形式にフォーマットできます。

2
Eman

AngularJSは.NET JSON日付/Date(xxxxxxxxxxxxx)/文字列も解析できませんでした。

Dateオブジェクトを直接ダンプするのではなく、日付をISO 8601文字列表現にフォーマットすることで、この問題を回避しました...

ASP.NET MVCコードのサンプルを次に示します。

return Json(new { 
  date : DateTime.Now.ToString("O") //ISO 8601 Angular understands this format
});

RFC 1123を試しましたが、機能しません。Angularは、これを日付ではなく文字列として扱います。

return Json(new { 
  date : DateTime.Now.ToString("R") //RFC 1123 Angular won't parse this
});
1
Rosdi Kasim

/Date(123232313131+1000)/のようなUTC差分情報でさえ、この形式の日付を提供する外部APIの問題に遭遇しました。次のコードでjs Dateオブジェクトに変えることができました

var val = '/Date(123232311-1000)/';
var pattern = /^\/Date\([0-9]+((\+|\-)[0-9]+)?\)\/$/;
var date = null;

// Check that the value matches /Date(123232311-1000)/ format
if (pattern.test(val)) {
  var number = val.replace('/Date(', '',).replace(')/', '');
  if (number.indexOf('+') >= 0) {
    var split = number.split('+');
    number = parseInt(split[0]) + parseInt(split[1]);
  } else if (number.indexOf('-') >= 0) {
    var split = number.split('-');
    number = parseInt(split[0]) - parseInt(split[1]);
  } else {
    number = parseInt(number);
    date = new Date(number);
  }
}
0
Martin Vich

eval関数を使用すると、前後のスラッシュを削除するだけで機能します。

var date1 = "/Date(25200000)/"
eval("new " + date1.substring(1, date1.length - 1));

1970年1月1日木曜日00:00:00 GMT-0700(米国山地標準時)

0
vernmic

この質問に対する答えは、nugetを使用してJSON.NETを取得し、JsonResultメソッド内でこれを使用することです。

JsonConvert.SerializeObject(/* JSON OBJECT TO SEND TO VIEW */);

あなたのビュー内でjavascriptでこれを簡単に行います:

JSON.parse(/* Converted JSON object */)

Ajax呼び出しの場合:

var request = $.ajax({ url: "@Url.Action("SomeAjaxAction", "SomeController")", dataType: "json"});
request.done(function (data, result) { var safe = JSON.parse(data); var date = new Date(safe.date); });

JSON.parseが呼び出されると、JsonConvertが適切なISO時間インスタンスを作成するため、JSON日付をnew Dateインスタンスに入れることができます

0

このようなことには.Netを使用していません。次のようなものを印刷できるようになった場合、動作するはずです。

そのJSONstringを他の方法で解析する場合、またはユーザーが使用する必要のあるJSONパーサーが組み込まれたモダンなブラウザをユーザーに期待する場合を除き、注意してくださいサーバーによって出力されたJSON文字列を実際のJSONオブジェクトに解析するJSフレームワークまたはJSON2。

// JSON received from server is in string format
var jsonString = '{"date":1251877601000}';

//use JSON2 or some JS library to parse the string
var jsonObject =  JSON.parse( jsonString );

//now you have your date!
alert( new Date(jsonObject.date) );

Wikiリンク

Firefox 3.5やInternet Explorer 8などの最新のブラウザーには、JSONを解析するための特別な機能が含まれています。ネイティブブラウザのサポートはeval()よりも効率的で安全であるため、ネイティブJSONサポートが次のECMAScript標準に含まれることが予想されます。[6]


JSON2ファイルへのリンク

ライブ例

0
subhaze
function parseJsonDate(jsonDate) {

    var fullDate = new Date(parseInt(jsonDate.substr(6)));
    var twoDigitMonth = (fullDate.getMonth() + 1) + ""; if (twoDigitMonth.length == 1) twoDigitMonth = "0" + twoDigitMonth;

    var twoDigitDate = fullDate.getDate() + ""; if (twoDigitDate.length == 1) twoDigitDate = "0" + twoDigitDate;
    var currentDate = twoDigitMonth + "/" + twoDigitDate + "/" + fullDate.getFullYear();

    return currentDate;
};
0
Muzafar

Callumが述べたように、私にとって最良の方法は、ControllerメソッドをJsonResultではなくstringに変更することです。

public string GetValues()
{
  MyObject.DateFrom = DateTime.Now;
  return JsonConvert.SerializeObject(MyObject);
}

Ajaxメソッドから次のようなことができます

 $.ajax({
 url: "/MyController/GetValues",
 type: "post",
 success: function (data) {
 var validData = JSON.parse(data);
//if you are using datepicker and you want set a format
$("#DateFrom").val($.datepicker.formatDate("dd/mm/yy", new Date(validData.DateFrom)));                                      
// if you want the date as returned
$("#DateFrom").val(new Date(validData.DateFrom))
}
});
0
onixpam