web-dev-qa-db-ja.com

.NET DateTimeからJSONへの変換

可能性のある複製:
JSON日付のフォーマット方法

私のWebサービスは、DateTimeをjQuery呼び出しに返しています。サービスは、次の形式でデータを返します。

/Date(1245398693390)/

これをJavaScriptに適した日付に変換するにはどうすればよいですか?

232
user76071

返されるのは、エポック以降のミリ秒です。できること:

var d = new Date();
d.setTime(1245398693390);
document.write(d);

日付を希望どおりにフォーマットする方法については、 http://www.w3schools.com/jsref/jsref_obj_date.asp で完全なDateリファレンスを参照してください。

整数を解析することで非数字を取り除くことができます( ここで提案されているように ):

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

または、次の正規表現を適用します(コメントのTominatorから)。

var jsonDate = jqueryCall();  // returns "/Date(1245398693390)/"; 
var re = /-?\d+/; 
var m = re.exec(jsonDate); 
var d = new Date(parseInt(m[0]));
242
vahidg

私はしばらくこのメソッドを使用しています:

using System;

public static class ExtensionMethods {
  // returns the number of milliseconds since Jan 1, 1970 (useful for converting C# dates to JS dates)
  public static double UnixTicks(this DateTime dt)
  {
    DateTime d1 = new DateTime(1970, 1, 1);
    DateTime d2 = dt.ToUniversalTime();
    TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
    return ts.TotalMilliseconds;
  }
}

.NET 3.5に対して開発していると仮定すると、それは単純なコピー/貼り付けです。それ以外の場合は移植できます。

これをJSONオブジェクトにカプセル化するか、単に応答ストリームに書き込むことができます。

Javascript/JSON側では、ティックを新しいDateオブジェクトに渡すだけでこれを日付に変換します。

jQuery.ajax({
  ...
  success: function(msg) {
    var d = new Date(msg);
  }
}
77

後方参照付きのString.replaceを使用して日付文字列を解析するには:

var milli = "/Date(1245398693390)/".replace(/\/Date\((-?\d+)\)\//, '$1');
var d = new Date(parseInt(milli));
33
William Niu

DateTimeを.Netコードからjavascriptコードに渡す場合、C#:

DateTime net_datetime = DateTime.Now;

javascriptは"/Date(1245398693390)/"のように文字列として扱います:

以下のように変換できます:

// convert the string to date correctly
var d = eval(net_datetime.slice(1, -1))

または:

// convert the string to date correctly
var d = eval("/Date(1245398693390)/".slice(1, -1))
17
ytl

時間情報の取得に問題がある場合は、次のようなものを試すことができます。

    d.date = d.date.replace('/Date(', '');
    d.date = d.date.replace(')/', '');  
    var expDate = new Date(parseInt(d.date));
16
davidmdem

1970,1,1からの変換には、小数点以下の桁数をゼロに丸める必要があります

DateTime d1 = new DateTime(1970, 1, 1);
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return Math.Round( ts.TotalMilliseconds,0);

クライアント側で私は使用します

new Date(+data.replace(/\D/g, ''));
11
Flash

http://stevenlevithan.com/assets/misc/date.format.js

var date = eval(data.Data.Entity.Slrq.replace(/\/Date\((\d )\)\//gi, "new Date($1)"));  
alert(date.format("yyyy-MM-dd HH:mm:ss"));  
alert(dateFormat(date, "yyyy-MM-dd HH:mm:ss"));  
7
harry

json.net のようなサードパーティライブラリを試すことができます。プロジェクトサイトにドキュメントがあります。 .net 3.5が必要だということです。

それ以外の場合は、Javaからの移植だと思うNii.jsonと呼ばれる別のものがあります。 このブログ にリンクを見つけました

6
Dave Archer

前の回答では、次のことができるすべての状態に回答しています。

var d = eval(net_datetime.slice(1, -1));

ただし、文字通り評価されるのは次のとおりであるため、ChromeまたはFFのいずれでも機能しません。

// returns the current timestamp instead of the specified Epoch timestamp
var d = Date([Epoch timestamp]);

これを行う正しい方法は次のとおりです。

var d = eval("new " + net_datetime.slice(1, -1)); // which parses to

var d = new Date([Epoch timestamp]); 
5
cowmoo

私が使用しているソリューションを追加すると思いました。

System.Web.Script.Serialization.JavaScriptSerializer()を使用している場合、返される時間はタイムゾーンに固有のものではありません。これを修正するには、dte.getTimezoneOffset()を使用して正しい時刻に戻すこともできます。

String.prototype.toDateFromAspNet = function() {
    var dte = eval("new " + this.replace(/\//g, '') + ";");
    dte.setMinutes(dte.getMinutes() - dte.getTimezoneOffset());
    return dte;
}

今、あなたは電話するだけです

"/Date(1245398693390)/".toDateFromAspNet();

2009年6月19日金曜日00:04:53 GMT-0400(東部夏時間){}

4
used2could